Сравните undefined / null / NaN с числом в ActionScript - PullRequest
0 голосов
/ 15 декабря 2011

В 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) return true.

Они противоречат стандарту JavaScript и могут не соответствовать стандарту ECMA.

Являются ли они ошибок или намерения ?

Спасибо!

1 Ответ

2 голосов
/ 15 декабря 2011

Поскольку 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...