CoffeeScript未定义


89

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

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

我想知道如何在coffeescript中这样做吗?...我尝试类似

if (MyVariable?false){ ... }

但是此检查if是否MyVariable是一个函数,如果可以,则将调用MyVariable(false),否则将调用void(0)或类似的函数。



尝试if MyVariable isnt undefined哪个产生if (MyVariable !== void 0)
亚米·奥德梅尔

Answers:


163

最终,我发现了这种简单的方法:

if (MyVariable?){ ... }

会产生:

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

更新04/07/2014 演示链接

在此处输入图片说明


58
实际上它仅生成item != null
Pencilcheck

13
@Pencilcheck-这是因为编译器确定该项目已在您的代码中定义。(也很出名-尽管现在是平板电脑对我来说:)此答案还选择了与未定义非常不同的空值。似乎是对另一个问题的回答,恕我直言
赛斯,

3
@Seth,是的,我一直都被这种细微差别所困扰,这引出了下一个逻辑问题:CS是否为以下内容提供任何语法捷径:MyVariable = MyMethod; 如果MyVariable?... MyMethod可能返回undefined?还是您必须诉诸if typeof myVariable isnt 'undefined'
neverfox

1
据我所知,@neverfox后者(未定义的类型检查)-CoffeeScript认为应将null和undefined混合使用。
赛斯

6
@Seth,不是真的。非严格比较(==!=)实际上将nullundefined视为相等的值,因此item != null实际上同时测试nullundefined。如果写为,则不会item !== null
toriningen 2014年

26

首先,回答您的问题:

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,则可能更具可读性。
亚伦·杜福

12
等同于!==,不是!=
Mischa Arefiev 2012年

1
这是最具体的答案-其他许多答案也与空值交互。Thx
赛斯,

1
Coffee !=中的@MischaArefiev ,可转换为!==JavaScript。
Suzana

14

此答案适用于较旧版本的coffeescript。如果您想要更新的答案,请参阅上面的Jaider的答案(截至2014年7月)

我写的这份咖啡脚本能满足您的需求:

if not MyVariable?
  MyVariable = "assign a value"

产生:

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

如果您MyVariable首先分配一个Nb ,即使您将此代码设置MyVariable为undefined ,那么它也会编译为:

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

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

ps你真的可以if (MyVariable?false){ ... }上班吗?除非存在运算符和false之间存在空格,否则它不会为我编译,因为MyVariable? false这会使CoffeeScript像函数一样检查它,因为false它认为这是您的参数MyVariable例如

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");
}

3
这是旧的咖啡脚本。在variable?现在只能编译变量!= NULL
Gambai

@冈巴你确定吗?该网站仍显示... !== null coffeescript.org/#try:variable%3F
AJP

1
是的,编译器有时会忽略!= undefined作为优化,因为该变量何时应在代码中的某个位置定义。我说应该,因为编译器不能总是正常工作...
Suzana

@Suzana_K很高兴知道。我敢肯定遇到这个问题的人会想要一个最新的答案,请随时编辑我的问题或发布新的答案,我将在我的顶部与之链接。在采用ES6 / TypeScript之后,我不再使用CoffeeScript了,所以我无法更新答案。实际上,看起来Jaider的答案涵盖了这一点: stackoverflow.com/a/10238211/539490
AJP


9

除了以上Jaider的回答(由于信誉不足我无法评论)之外,请注意,如果它在对象/数组中,则情况会有所不同:

someArray['key']?

将转换为:

someArray['key'] != null

js2coffee.org的屏幕截图:

js2coffee.org


您正在检查密钥是否存在,因此这很有意义。如果还需要检查数组是否存在,请尝试someArray?['key']?
约书亚·戴维森

6

我只用:

if (myVariable)
    //do stuff

由于undefined是虚假的,因此只有在myVariable不是undefined的情况下,它才会起作用。

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


1
我更喜欢这种方法,只要myVariable不允许它是像null或那样的虚假值即可0
布莱恩·唐宁

3

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

unless ( myVar? )
    myVar = 'val'

6
myVar ?= 'val'
Ricket

2

为什么不只使用OR习惯用法呢?

myVar or 'val'

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


3
有了这个成语的任何falsish值将返回“VAL”,而不是什么它应该是-包括''0.0false。这可能不是不想要的。
toriningen 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.