| 谈谈Flash的一些语法基础和系统核心 2.2 变量的数值计算 |
|
谈谈Flash的一些语法基础和系统核心 2.2 变量的数值计算 |
| 作者:佚名 来源:闪吧 作者: ox_thedarkness 更新:2007-1-13 20:47:28 错误报告 我要投稿 |
参与本文讨论:闪吧本文讨论帖 2.2.1 变量的自动类型转换 tip: trace( string ) trace( number ) 可以在状态栏输出一行文字。 as里面的变量类型转换方便到一塌糊涂 几个等价的冬冬: 1 == true; 0 == false , 但是其他数字以及字符串都不能和boolean等价。 还有就是: null == undefined 转换并没有优先级,关键看运算符。 比如,任何数字或者boolean + 一个string 结果都被强制转换成 string,而undefined强制转换为string的时候是一个空字串 "",而 string * 一个数字 string 会被转换成数字。 你可以用 ""+12.32 把数字12.32变成字符串,也可以用"12.32" * 1 把字符串"12.32"变成数字 tip: typeof <变量名> 返回一个字符串,表示变量的基本类型: 基本类型:number、 boolean 、string 引用类型:object、 function 、movieclip 然后就是变量不存在:
a = 102.43 trace(typeof a + " " +a); a += ""; trace(typeof a + " " +a); a *= 1; trace(typeof a + " " +a);
结果:
number 102.43 string 102.43 number 102.43 2.2.2 Infinity、 -Infinity 和NaN 他们是3个数字常量。关于他们的官方描述,请在help里面搜索他们的名称。 Infinity 和-Infinity:正无穷大 很多运算结果都是正无穷。比如,任何数除以0得到结果是正无穷大。 Infinity * -1 = -Infinity 任何数除以Infinity = 0 NaN:not a number 他表示超出数字表示范围的数字(他是数字),值等于Number.NaN NaN参与大部分数学运算返回都是NaN 但是参与某些运算,比如除法结果是 Infinity或者-Infinity 他们参与字符串转换分别转换成对应的字符串比如:
var a = "NaN.toString() is: " a += NaN trace(a); 结果是: NaN.toString() is: NaN 2.2.3 undefined 的类型转换 undefined的类型转换基本上都涉及到兼容性问题: 进行类型转换的时候,undefined 在 flashplayer6和7中有不同的值。 数字转换: 6中会转换成数字0,也就是说,所有未定义的变量数值计算都作0看 但是7中会转换成一个数字常量NaN 下例中,如果b==nul,那么如下的代码在flash6 和7中会有两个结果。
trace(b); b++; trace(b); flashplayer6结果是: undefined 1 flashplayer7结果是: undefined NaN 字符串转换: 6中会转换成空字串,但是7中会转换成一个字符串undefined: 假设下例b未定义
: a = "result: " a += b; trace(a); flashplayer6结果是: result: flashplayer7结果是: result: undefined 但是由于6里面trace()函数重载了undefined值,所以: trace( undefined ) 显示 undefined 而trace( "" + undefined) ,首先计算 ""+undefined ,结果是"" ,于是输出空行。 2.2.4 浮点数 首先问一个有趣的问题: 0.15 + 0.15 = 0.3吗? 显然,执行: trace( 0.15+0.15 == 0.3 ) 结果是true。 那么,0.1 + 0.2 = 0.3吗? 不要想当然,上机试试才知道: trace( 0.1 + 0.2 == 0.3 ) 结果居然是false!! 怎么回事?那么0.1 + 0.2到底是多少呢? 试试看: trace( 0.1 + 0.2) 结果的确显示0.3,可是 0.1 + 0.2 == 0.3 结果仍然是flase…… 看看这个: trace( 0.1 + 0.2 - 0.3 ) 结果是: 5.55111512312578e-17 也就是相差大约 5 x 10的-17次方…… flash里面的数,无论整数浮点数统称 number ,然而在内部还是有区别的。整数计算没有误差,而浮点数计算总会出现误差。 一定要避免由此而出现bug,整个世界可能就在某个角落莫名其妙的崩溃。防不胜防而且很难检测出来。 比如,对于浮点数,千万不能用 == 判断两个数是否相等。 如果是循环,用大于、小于; 如果一定要判断浮点数相等的话,你应该类似这样替代 if(a == b): if ( (a< b + 1e-15) && (a>b -1e-15) ) 也就是要求a 和b差别很小,而不是相等。 出于上述理由,我们能用整数尽量用整数。
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |