Краткий ответ : они эквивалентны по поведению, а компиляция != 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"
, чтобы предотвратить возможный сбой вашего процесса.