在ActionScript 1和2中,如果您使用undefined
或null
运算符将NaN
,>=
或<=
与任意数字进行比较,结果为总是true
。测试代码:
var x, n, range = 1000;
for (var i = 0; i < 3; ++i) {
switch (i) {
case 0:
x = undefined;
break;
case 1:
x = null;
break;
case 2:
x = NaN;
break;
}
n = range*Math.random();
trace(x + ' >= ' + n + ': ' + (x >= n));
n = range*Math.random();
trace(x + ' <= ' + n + ': ' + (x <= n));
}
此外,isNaN(null)
返回true
。
这些与JavaScript相反,可能不符合ECMA标准。
这些错误或意图?
谢谢!
答案 0 :(得分:2)
由于ActionScript 2只知道一个数字类型Number,所以比较中的所有非数字元素都被强制转换为Number - 这与写入相同:
Number (null) <= n
Number (undefined) <= n
Number (NaN) <= n
Number (
{除了数字之外的任何内容} )
始终返回NaN,因此您的所有语句都只是将随机数与NaN进行比较。 ActionScript文档清楚地警告NaN不具有可比性,并建议始终使用isNaN()来测试它。
如果你做与NaN比较,那么在AS2中这是一个奇怪的事情:
NaN == Number // returns false
NaN != Number // returns true
这些表现符合预期,但是:
NaN >= Number // returns true
NaN <= Number // returns true
最后:
NaN > Number // returns undefined
NaN < Number // returns undefined
当然这不是很直观 - 任何与NaN的比较都应该是假的,并且已在AS 3中修复 - 但绝对意义上null
不是数字,因此{{1 应该返回isNaN(null)
。