Coffeescript存在运算符有时会检查未定义但不总是

时间:2014-02-11 10:59:50

标签: javascript coffeescript

这个coffeescript ......

if x? isnt '' then console.log x

编译到这个javascript ...

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

针对typeof x

检查undefined的位置

但是,如果我在当前范围内使用x,coffeescript会在范围的to中明确声明它,然后不会检查undefined ...

这个coffeescript ......

x = y.z
if x? isnt '' then console.log x

编译到这个javascript ...

var x;

x = y.z;

if ((x != null) !== '') {
  console.log(x);
}

如果xundefined,则y.z最终可能会undefined。为什么coffeescript不觉得需要在if语句中检查undefined?

1 个答案:

答案 0 :(得分:2)

让我们从更明显的案例开始,第二个例子:

编译器知道var x已声明,即使它未定义,所以它需要做的就是检查值是null还是undefined完成x != null

然而,在第一个例子中并非如此。 x尚未在任何地方声明,因此尝试x != null实际上会抛出ReferenceError,但typeof x会返回一个值(如果x实际上是null不是undefined或{{1}}所有将在宇宙中存在。