node.js - coffeescript 编译器的奇怪行为

标签 node.js coffeescript

我注意到 coffeescript 编译器对我来说有一个无法解释的行为 :)

例如:

getImage: (req, res) =>
    realty_id = req.query.id

    if (realty_id?)

结果

ImageController.prototype.getImage = function(req, res) {
    var realty_id,
        _this = this;
      realty_id = req.query.id;
      if ((realty_id != null)

但实际上最后一行应该是:if ((typeof realty_id !== "undefined"&& realty_id !== null))

当我注释掉“realty_id = req.query.id”时,效果很好。有人对此有解释吗?

最佳答案

tldr; local JavaScript 变量不需要 typeof x !== "undefined"

SO 问题 CoffeeScript Existential Operator and this有关于为什么 CoffeeScript 会进行这种优化的信息。

现在,看看为什么它在当前案例中是有效代码生成:

-> x         x != null   typeof x !== "undefined" && x !== null
----------   ---------   -------------------------------------
ANY_TRUE     true        true
0            true        true
null         false       false
undefined    false       false

因此,根据逻辑表,它们在语义上是等价的。 == 运算符的“非严格”性质决定了这种比较的结果(也许令人惊讶):所以关于该主题的问题比比皆是。

但是,这里是有时/为什么使用 typeof x !== "undefined" 的重要区别:它不会导致 ReferenceError 。如果已知 x 是一个局部变量,那么就没有这样的考虑,可以安全地使用较短的 (!=) JavaScript 表达式。

在 CoffeeScript 中的赋值被注释掉的情况下,没有局部变量/名称为 reality_id 的绑定(bind) - 请注意 var 语句也不同 - CoffeeScript 会根据需要插入额外的保护。

关于node.js - coffeescript 编译器的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13464552/

相关文章:

javascript - Chart.js 圆环图保持灰色 - 没有颜色

javascript - 如何将 RFC822 消息体 body 存储为 String?

javascript - 最好的 NodeJS 库/包装器的在线支付服务

javascript - 两个用户在 socket.io 中获得控制访问 - 竞争条件

javascript - Ember.Object 中的多个属性或单个观察者

node.js - 在 openssl 中解密 node.js aes-256-cbc 字符串

ember.js - 为什么使用 itemController 会呈现空项目的集合?

javascript - Rails 3.1 是否包括整个 jQuery 库?

javascript - CoffeeScript 原型(prototype)错误

javascript - 使用 Backbone 更新页面标题,使其在浏览器历史记录中正确显示