【问题标题】:CoffeeScript UndefinedCoffeeScript 未定义
【发布时间】:2012-04-13 07:57:48
【问题描述】:

在javascript中检查变量是否从未创建,我们只是这样做

if (typeof MyVariable !== "undefined"){ ... }

我想知道我是如何在咖啡脚本中做到这一点的?...我尝试类似

if (MyVariable?false){ ... }

但是这个检查MyVariable是否是一个函数,如果是这样,它将调用MyVariable(false),如果不是,它将调用void(0)或类似的东西。

【问题讨论】:

标签: coffeescript undefined


【解决方案1】:

此答案适用于旧版本的咖啡脚本。如果您需要更新的答案(截至 2014 年 7 月),请参阅 Jaider's answer above

This coffeescript 做你想做的事:

if not MyVariable?
  MyVariable = "assign a value"

产生:

if (!(typeof MyVariable !== "undefined" && MyVariable !== null)) {
  MyVariable = "assign a value";
}

注意如果您首先对MyVariable 进行分配,即使您将MyVariable 设置为未定义,如this code 中那样,则编译为:

if (!(MyVariable != null)) {
  MyVariable = "assign a value";
}

我相信这是可行的,因为 CoffeeScripts 使用的 != Existential Operator(问号)强制 undefined 等于 null

附言你真的可以让if (MyVariable?false){ ... } 工作吗?它不会为我编译,除非存在运算符和 false 之间有空格,即 MyVariable? false,然后使 CoffeeScript 像函数一样检查它,因为它认为 false 是你的 MyVariable、@987654324 的参数@:

if MyVariable? false
  alert "Would have attempted to call MyVariable as a function"
else
  alert "but didn't call MyVariable as it wasn't a function"

生产:

if (typeof MyVariable === "function" ? MyVariable(false) : void 0) {
  alert("Would have attempted to call MyVariable as a function");
} else {
  alert("but didn't call MyVariable as it wasn't a function");
}

【讨论】:

  • 这是旧的咖啡脚本。 variable? 现在只编译为变量!= null
  • @Gambai 你确定吗?网站依旧显示... !== nullcoffeescript.org/#try:variable%3F
  • 是的,编译器现在有时会省略 != undefined 作为优化,因为何时应该在代码中的某处定义变量。我说应该是因为编译器并不总是能正常工作...
  • @Suzana_K 很高兴知道。我相信遇到这个问题的人会想要一个最新的答案,请随时编辑我的答案或发布新的答案,我会从我的顶部链接到它。采用 ES6 / TypeScript 后我不再使用 CoffeeScript,因此无法更新答案。实际上,Jaider 的回答似乎涵盖了它:stackoverflow.com/a/10238211/539490
【解决方案2】:

我只是使用:

if (myVariable)
    //do stuff

由于 undefined 是假的,它只会在 myVariable 不是 undefined 时才起作用。

您只需要知道它会为 0、"" 和 null 的值“做一些事情”

【讨论】:

  • 我更喜欢这种方法,只要 myVariable 不允许像 null0 这样的虚假值。
【解决方案3】:

最后我找到了这个简单的方法:

if (MyVariable?){ ... }

这将产生:

if (typeof MyVariable !== "undefined" && MyVariable !== null){ ... }

2014 年 4 月 7 日更新 Demo Link

【讨论】:

  • 其实只生成了item != null
  • @Pencilcheck - 这是因为编译器确定该项目已在您的代码中定义。 (还有,好名字——虽然它现在对我来说是平板电脑检查:) 这个答案还选择了与未定义非常不同的空值。恕我直言,这似乎是对另一个问题的回答
  • @Seth,是的,我一直被这种细微差别所困扰,这引发了下一个合乎逻辑的问题:CS 是否为以下内容提供任何语法快捷方式:MyVariable = MyMethod; if MyVariable?... MyMethod 可能在哪里返回undefined?还是必须求助于if typeof myVariable isnt 'undefined'
  • @neverfox 后者据我所知(未定义类型检查)- CoffeeScript 认为 null 和 undefined 应该混为一谈。
  • @Seth,不是真的。非严格比较(==!=)实际上将nullundefined 视为相等的值,因此item != null 实际上同时测试nullundefined。如果写成item !== null,则不会。
【解决方案4】:

除了上面的Jaider's answer(由于声誉不足,我无法发表评论),请注意,如果它是对象/数组中的东西,则情况不同:

someArray['key']?

将转换为:

someArray['key'] != null

截图来自js2coffee.org:

【讨论】:

  • 您正在检查密钥是否存在,所以这是有道理的。如果还需要检查数组是否存在,试试 someArray?['key']?
【解决方案5】:

为什么不直接使用 OR 成语?

myVar or 'val'

因此,结果将等于 myVar,除非它未定义,在这种情况下它将等于 'val'。

【讨论】:

  • 使用这个习语,任何虚假值都将返回 'val' 而不是它应有的值 — 包括 ''0.0false。这可能不是不需要的。
【解决方案6】:

我发现将变量分配给未定义且非空变量的最简洁方法是使用unless

unless ( myVar? )
    myVar = 'val'

【讨论】:

    【解决方案7】:

    首先,回答你的问题:

    if typeof myVariable isnt 'undefined' then # do stuff
    

    Magrangs 的解决方案在大多数情况下都可以使用,除非您需要区分 undefined 和 false(例如,如果 myVariable 可以是 true、false 或 undefined)。

    需要指出的是,您不应该将条件括在括号中,也不应该使用花括号。

    then 关键字可以在所有内容都在同一行时使用,否则使用缩进来指示条件内的代码。

    if something  
        # this is inside the if-statement  
    # this is back outside of the if-statement
    

    希望这会有所帮助!

    【讨论】:

    • isnt关键字相当于Coffeescript中的!=,如果你习惯了javascript,可能会更易读。
    • 等价于!==,而不是!=
    • 这是最具体的答案 - 许多其他人也与空值交互。谢谢
    • @MischaArefiev != 在 Coffee 中,在 JavaScript 中转换为 !==
    【解决方案8】:
    typeof MyVariable isnt "undefined" 
    

    来自js2coffee

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 1970-01-01
      • 2017-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多