Number,int和NaN
自从AS3中加入了int后,我使用int的次数就多过Number。并不是为了降低那一点点的内存占用,而是实在用整数的机会比较多。本文讨论的,就是使用int的地方,却必须使用Number的情况。
听起来比较拗口,那看看下面这个例子吧:
1public function move($x:int, $y:int=NaN):void
2{
3 if(isNaN($y))
4 $y = $x;
5 this.x += $x;
6 this.y += $y;
7}
想来上面这种情况大家可能会碰到。x和y相同的情况比较多,所以为了偷懒,我就不想提供y参数。y在这里可以是任何整数值,所以我不能将它的默认值设置成一个特殊的整数值(比如-1),然后通过比较来判断是不是让y与x的值相等。
在这里,NaN就是一个最好的选择。NaN不是任何数字,所以处理起来就简单许多了。只需要判断y是不是默认值NaN,就可以处理后面的情况。
不过,上面这个例子是错误的。如果执行,在不提供y参数的时候,y的值永远是0。
可以看看下面这个完整的例子,比上面的部分代码更能说明问题:
1package
2{
3import flash.display.Sprite;
4public class TestNaN extends Sprite
5{
6 public function TestNaN()
7 {
8 test();
9 test(null);
10 test(undefined);
11 test(1);
12 }
13
14 public function test($num:int=NaN):void
15 {
16 trace($num);
17 }
18}
19}
运行后得到的结果是:
[trace] 0
[trace] 0
[trace] 0
[trace] 1
而将test方法的$num参数的类型从int改成Number,就能得到我们需要的结果:
[trace] NaN
[trace] 0
[trace] NaN
[trace] 1
原因是什么?这又回到了很久很久以前在AS3刚刚出来的时候,对默认值的强制类型转换的一些讨论。原因很简单:Number和int的类型转换的处理方式不同。
有兴趣的话,还可以研究下Class()转换与as转换。也有很多有趣的地方。
这篇07年的文章也值得一看:AS3中的强制类型转换
- 文章ID:1329
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/number_int_and_nan/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。