Как работает экзистенциальный оператор 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, если переменная не равна нулю или не определена, что делает ее аналогом Ruby nil?

так что, конечно, это скажет "Нет тако!"

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 с помощью обратных галочек.

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