3

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

例如:

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”时,它运行良好。有没有人对此作出解释?

4

1 回答 1

3

tldr; 本地JavaScript 变量typeof x !== "undefined"不需要。

SO问题CoffeeScript Existential Operator,这有关于为什么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"但是,有时使用when/why 的重要区别在于:它不会导致ReferenceError. 如果x已知是局部变量,则无需考虑,!=可以安全地使用较短的 ( ) JavaScript 表达式。

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

于 2012-11-20T01:26:46.470 回答