В чем разница между "если 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:

Экзистенциальный оператор CoffeeScript? возвращает true, если переменная не равна нулю или не определена.

isntс другой стороны, просто переводится как !==, это означает, что это неравное сравнение без преобразования типов.

Итак, вместе взятые, первая проверка в вашем примере вернет true если и только если a не является undefined, Второй вернется true если a не является undefined и не null,

Другие вопросы по тегам