将undefined / null / NaN与ActionScript中的数字进行比较

时间:2011-12-15 09:31:54

标签: javascript flash actionscript null undefined

在ActionScript 1和2中,如果您使用undefinednull运算符将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标准。

这些错误意图

谢谢!

1 个答案:

答案 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)