В чем разница между "если a не неопределенный" и "если a?" в coffeescript?
Следующий код
if a isnt undefined
b = 1
if a?
b = 1
компилируется в следующий JavaScript
var b;
if (a !== void 0) {
b = 1;
}
if (typeof a !== "undefined" && a !== null) {
b = 1;
}
Эти две проверки эквивалентны? При каких условиях они отличаются?
4 ответа
TLDR: обычно при проверке наличия переменной foo?
будет самым безопасным.
foo?
проверяет, что foo не является ни нулевым, ни неопределенным. Он не выдаст ошибку, если foo не был объявлен:
typeof foo !== "undefined" && foo !== null;
> false
var foo = null;
typeof foo !== "undefined" && foo !== null;
> false
var foo = 123;
typeof foo !== "undefined" && foo !== null;
> true
foo isnt undefined
проверяет, что foo не равно undefined. Если foo не был объявлен, он выдаст ошибку. Если foo равно нулю, он вернет true:
foo !== void 0;
> ReferenceError // OH NO!
var foo;
foo !== void 0;
> false
var foo = 123;
foo !== void 0;
> true
var foo = null;
foo !== void 0;
> true // OH NO!
НОТА: void 0
эквивалентно undefined
a isnt undefined
оценивается как false, если a не определено, в противном случае - true
a?
оценивается как false, если a не определено или имеет значение null, в противном случае - true
Таким образом, единственное функциональное отличие состоит в том, является ли значение null истинным или ложным.
С точки зрения читабельности первый будет понятен практически любому, второй - короче и понятен любому, кто имеет базовые знания синтаксиса coffeescript.
В JavaScript void
Оператор вычисляет выражение и затем возвращает undefined
, Так void 0
возвращается undefined
, Следовательно isnt undefined
строго тесты против неопределенного, тогда как ?
проверяет против undefined
а также null
,
В любом случае они будут отличаться, если проверяемое значение null
скорее, чем undefined
так как значения типа заметно отличаются.
Экзистенциальный оператор CoffeeScript? возвращает true, если переменная не равна нулю или не определена.
isnt
с другой стороны, просто переводится как !==
, это означает, что это неравное сравнение без преобразования типов.
Итак, вместе взятые, первая проверка в вашем примере вернет true
если и только если a
не является undefined
, Второй вернется true
если a
не является undefined
и не null
,