CoffeeScript 未定义

Posted

技术标签:

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

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

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

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

if (MyVariable?false) ... 

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

【问题讨论】:

另见coffeescript not null or undefined 试试if MyVariable isnt undefined,它会产生if (MyVariable !== void 0) 【参考方案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 的回答似乎涵盖了它:***.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

【讨论】:

以上是关于CoffeeScript 未定义的主要内容,如果未能解决你的问题,请参考以下文章

CoffeeScript 未定义

Coffeescript 未定义的类?

Coffeescript函数未定义[重复]

在 CoffeeScript 文件上运行 Jasmine 测试时对象未定义错误

Coffeescript 未捕获参考

第 6 行 (CoffeeScript) 中未关闭的 INDENT 编译器错误