Ответ 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
.