比较未定义/null/NaN与ActionScript中的number

Compare undefined/null/NaN with number in ActionScript

本文关键字:ActionScript 中的 number NaN 未定义 null 比较      更新时间:2023-09-26

在ActionScript 1和2中,如果您使用>=<=运算符将undefined, nullNaN与任意数字进行比较,结果始终是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标准。

这些bug 还是意图?

谢谢!

由于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不是一个数字是绝对有意义的,因此isNaN(null) 应该返回true