Есть ли разница между проверкой неравенства (! ==) против неопределенного и нулевого значения и проверкой неравенства (! =) Против нулевого значения? - PullRequest
4 голосов
/ 01 декабря 2011

Если я передам переменную экзистенциальному оператору в Coffescript, она преобразуется в пару !== сравнений:

            compiles to
Coffeescript ------> JS
a?                   typeof a !== "undefined" && a !== null;

Но если я использую литерал или выражение, вместо этого используется != сравнение:

            compiles to
Coffeescript ------> JS
17?                  17 != null;

//same thing for regexps, strings, function calls and other expressions
//as far as I know.

Есть ли причина предпочитать двойные !== с более коротким != null, чем, возможно, радовать JSLint?

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

Краткий ответ : они эквивалентны по поведению, а компиляция != null является оптимизацией. В любом случае, x? означает, что x не является ни null, ни undefined.

Люди часто спрашивают об этом на трекере проблем CoffeeScript. Причина, по которой x != null не используется везде, поскольку скомпилированный вывод x? состоит в том, что x != null (или любое другое сравнение с x) вызывает ошибку времени выполнения, если x не существует. Попробуйте это на узле REPL:

> x != null
ReferenceError: x is not defined

Под "не существует" я имею в виду нет var x, нет window.x = ..., и вы не находитесь в функции, где x - это имя аргумента. (Компилятор CoffeeScript не может идентифицировать случай window.x, потому что он не делает никаких предположений о среде, в которой вы находитесь.) Так что, если в текущей области нет объявления var x или аргумента с именем x, компилятор должен использовать typeof x !== "undefined", чтобы предотвратить возможный сбой вашего процесса.

1 голос
/ 01 декабря 2011

Я могу понять, почему люди находят это непонятным.В ECMAScript:

a?

эквивалентно:

typeof a !== 'undefined' && a !== undefined && a !== null && a !== 0 && a !== false && a !== '';

Рефакторинг Coffeescript для:

typeof a !== "undefined" && a !== null;

означает, что:

var a = false;
a?;  // evaluates to true?

Это правильно?

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