Как работает экзистенциальный оператор CoffeeScript?
Coffeescript использует экзистенциальный оператор, чтобы определить, когда существует переменная, и в документации по http://coffeescript.org/ он показывает, что something?
будет компилировать в something !== undefined && something !== null
Однако я заметил, что моя версия Coffeescript только компилирует это something !== null
поэтому я написал тест, чтобы увидеть, как это повлияет на мой код
taco = undefined
if taco?
console.log "fiesta!"
else
console.log "No taco!"
который составлен в
// Generated by CoffeeScript 1.4.0
(function() {
var taco;
taco = void 0;
if (taco != null) {
console.log("fiesta!");
} else {
console.log("No taco!");
}
}).call(this);
и вывел несколько неожиданный No taco!
так что мой вопрос в два раза. Почему coffeescript больше не проверяет значение undefined
и почему этот suficiant?
1 ответ
Документация говорит об этом ?
:
Экзистенциальный оператор CoffeeScript
?
возвращает true, если переменная не равна нулю или не определена, что делает ее аналогом Rubynil?
так что, конечно, это скажет "Нет тако!"
taco = undefined
if taco?
console.log "fiesta!"
else
console.log "No taco!"
Ваш taco
явно undefined
так taco?
ложно
CoffeeScript неявно объявляет переменные, поэтому форма JavaScript ?
зависит от контекста. Например, если вы просто говорите только это:
if taco?
console.log "fiesta!"
else
console.log "No taco!"
вы увидите, что taco?
становится typeof taco !== "undefined" && taco !== null
, Вы все еще видите "это null
"проверить (в более жесткой форме), но есть также" есть ли var taco
" проверить с typeof
; обратите внимание, что typeof taco
тест также проверяет taco = undefined
так строже !==
тест может быть использован, чтобы увидеть, если taco
является null
,
Вы говорите это:
Я заметил, что моя версия coffeescript только компилирует это в
something !== null
но это не то, что он делает, это на самом деле компилируется в something != null
; обратите внимание на использование "неаккуратного" неравенства преобразования типов (!=
) по сравнению со строгим неравенством (!==
) что вы утверждаете, что есть. Разница между !=
а также !==
здесь важно, так как:
- Нулевой и неопределенный типы
==
(но нет===
)
Так что, если вы знаете эту переменную v
был объявлен (т.е. есть var v
где-то) тогда v != null
достаточно проверить, что v
не является ни null
ни undefined
, Тем не менее, если вы не знаете, что v
был объявлен, тогда вам нужно typeof
установите флажок, чтобы избежать ошибки ReferenceError при попытке сравнить необъявленную переменную с null
, Рассмотрим этот JavaScript:
if(taco != null) {
console.log("fiesta!");
} else {
console.log("No taco!");
}
Это бросит ReferenceError в ваше лицо, так как taco
не существует. Это:
if(typeof taco !== "undefined" && taco !== null)
console.log("fiesta!");
} else {
console.log("No taco!");
}
с другой стороны, хорошо, так как typeof
проверить меры предосторожности против попыток получить доступ к тому, что не было объявлено. Я не думаю, что вы можете создать первый в CoffeeScript без встраивания JavaScript с помощью обратных галочек.