javascript - Coffeescript 存在运算符有时会检查未定义的情况,但并非总是如此

标签 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);
}

有可能x最终是 undefined如果y.zundefined 。为什么coffeescript 觉得不需要检查 if 语句中是否未定义?

最佳答案

让我们从更明显的情况开始,即第二个示例:

编译器知道 var x 已声明,即使它没有定义,因此它需要做的就是检查该值是否为 nullundefined 可以通过 x != null 来完成。

但是,第一个示例中的情况并非如此。 x 尚未在任何地方声明,因此尝试 x != null 实际上会抛出 ReferenceError,但是 typeof x > 将返回一个值(如果 x 实际上不是 nullundefined,所有这些都将在宇宙中。

关于javascript - Coffeescript 存在运算符有时会检查未定义的情况,但并非总是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21699966/

相关文章:

javascript - 使用 PHP 和 JavaScript 以逗号分隔获取多个值

java - 请求参数丢失加号

ajax - 转换图像数据以在浏览器中呈现图像

javascript - AngularJS 无法发送内容类型为 :application/json 的发布请求

javascript - 如何使 JS 对象在多个文件中可用

javascript - Karma 和 CoffeScript 以及代码覆盖率

javascript - 如何在reactjs中设置状态时使用三元运算

javascript - Origin 没有使用地理定位服务的权限——即使是通过 HTTPS

javascript - 编译 CoffeeScript 时如何保留目录结构?

javascript - jQuery Validate Remote - 检查电子邮件是否已经存在