gpt4 book ai didi

CoffeeScript 存在运算符和这个

转载 作者:行者123 更新时间:2023-12-04 02:00:15 27 4
gpt4 key购买 nike

我注意到 CoffeeScript 编译器有些奇怪,想知道这是否是正确的行为。如果它是正确的,我很好奇为什么会有区别..

鉴于以下 CoffeeScript:

if @myVar?
alert myVar

我期待它像这样编译成 JavaScript:
if (typeof this.myVar !== "undefined" && this.myVar !== null) {
alert(myVar);
}

但是 CoffeeScript 编译器输出的是这样的:
if (this.myVar != null) {
alert(myVar);
}

如果我不引用这个(或任何其他父对象),CoffeeScript 会按照我的预期进行编译。

这是正确的行为吗?如果是这样,为什么使用它时它的工作方式不同?

编辑:

添加更多说明。这不仅发生在 this 上,而且发生在对象的任何其他属性上。例如,如果我将上面的 CoffeeScript 替换为下面的内容,它仍然只会编译为“!= null”...
if myVar.myProp?
alert myVar

最佳答案

如果是:

myVar = 10
if myVar?
alert myVar

Coffeescript 编译器可以看到 myVar真正定义在第一行,所以可以省略 typeof myVar !== "undefined"查看。
if (myVar !== null) {
alert(myVar);
}

但在这种情况下:
if myVar?
alert myVar

编译器不能保证 myVar实际上是定义的,所以需要额外的检查:
if (typeof myVar !== "undefined" && myVar !== null) {
alert(myVar);
}

所以,答案是:Coffeescript 编译器试图聪明地生成高效的代码。

编辑
Coffeescript 处理属性的方式也是正确的: this.prop将返回 undefined如果未定义属性。 !=将其转换为空。这就是为什么我们不需要额外的检查。
简而言之:
  • 访问 undefined variable 抛出异常——需要检查 typeof
  • 访问未定义的属性返回 undefined -- 只是 !=够了
  • 关于CoffeeScript 存在运算符和这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9992620/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com