我注意到 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/