Кофе script тестирование, если не определено

в соответствии с сайтом script

console.log(s) if s?

должен генерировать

if (typeof s !== "undefined" && s !== null) {
    console.log(s);
}

Но то, что появляется в моем браузере,

  if (s != null) {
      return console.log(s);
  }

Использование кофе - script - источник (1.6.2), кофейные рельсы (3.2.2), рельс-магистраль (0.7.2), рельсы (3.2.13)

Вот моя функция кофе script. любые мысли о том, почему я не получаю то, что кофе script говорит, что я должен?

window.p = (s) ->
    console.log(s) if s?

Ответы

Ответ 1

Если вы говорите только голый:

console.log(s) if s?

то вы действительно получите ожидаемый JavaScript (demo):

if (typeof s !== "undefined" && s !== null) {
  console.log(s);
}

Однако, если s - известная переменная, такая как здесь:

f = (s) -> console.log(s) if s?

то вы получите (demo):

if (s != null) {
  //...
}

для теста s?.

Так почему же разница? В первом случае CoffeeScript не может гарантировать существование переменной s в любом месте, поэтому она должна выполнить проверку typeof s, чтобы избежать исключения ReferenceError.

Однако, если s, как известно, существует потому, что он является функциональным параметром или был назначен как локальная переменная (так, чтобы CoffeeScript создавал var s), тогда вам не нужен typeof s проверьте, так как вы не можете в этом случае получить ReferenceError.

Это оставляет нас с s !== null по сравнению с s != null. Опустившись до нестрого неравенства (s != null), вы можете проверить, есть ли s undefined или null с одним сравнением. Когда вы проверяете typeof s !== "undefined", вы завершаете тег undefined с помощью "есть ли переменная s" и строгий тест s !== null - это все, что вам нужно проверить для null.

Ответ 2

Вы правы,

(s) -> console.log(s) if s?

console.log(x) if x?

компилируется в

(function(s) {
  if (s != null) {
    return console.log(s);
  }
});

if (typeof x !== "undefined" && x !== null) {
  console.log(x);
}

Похоже, что компилятор CoffeeScript немного оптимизирует Javascript для вас, потому что в случае аргумента функции, подобного этому, typeof s никогда не будет undefined, поскольку s определяется прямо там в функции подпись, даже если ее значение null.