Coffeescript 咖啡脚本未定义

Coffeescript 咖啡脚本未定义,coffeescript,undefined,Coffeescript,Undefined,在javascript中检查变量是否从未创建过,我们只需这样做 if (typeof MyVariable !== "undefined"){ ... } 我想知道我是怎么在咖啡剧本里做到的?。。。我试着做些类似的事情 if (MyVariable?false){ ... } 但是这个检查如果MyVariable是一个函数,如果是,它将调用MyVariable(false),如果不是,它将调用void(0)或类似的东西。我只使用: if (myVariable) //do stuff

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

if (typeof MyVariable !== "undefined"){ ... }
我想知道我是怎么在咖啡剧本里做到的?。。。我试着做些类似的事情

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

我只使用:

if (myVariable)
    //do stuff
因为undefined是falsy,所以只有在myVariable未定义的情况下,它才会执行某些操作

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


首先,回答您的问题:

if typeof myVariable isnt 'undefined' then # do stuff
Magrangs的解决方案在大多数情况下都有效,除非您需要区分未定义和false(例如,如果myVariable可以是true、false或未定义)

我要指出的是,你不应该把条件用括号括起来,也不应该用大括号

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

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

希望这有帮助

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

if (MyVariable?){ ... }
这将产生:

if (typeof MyVariable !== "undefined" && MyVariable !== null){ ... }
更新日期2014年7月4日


这个答案适用于旧版本的coffeescript。查看您是否需要更新的答案(截至2014年7月)

你想要什么我想:

if not MyVariable?
  MyVariable = "assign a value"
产生:

if (!(typeof MyVariable !== "undefined" && MyVariable !== null)) {
  MyVariable = "assign a value";
}
注意:如果您首先对
MyVariable
进行赋值,即使您将
MyVariable
设置为未定义(如中所示),也会编译为:

if (!(MyVariable != null)) {
  MyVariable = "assign a value";
}
我相信这是有效的,因为
=存在运算符(问号)强制
未定义的
等于

p、 如果(MyVariable?false){…}
,你真的能让
工作吗?它不会为我编译,除非存在运算符和false之间有一个空格,即
MyVariable?false
使CoffeeScript像函数一样检查它,因为它认为它是
MyVariable
的一个参数:

产生:

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

我发现将变量分配给未定义且非空的变量的最干净的方法是使用
,除非

unless ( myVar? )
    myVar = 'val'

为什么不直接使用这个词或成语呢

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

除上述情况外(由于信誉不足,我无法评论),请注意,如果它是对象/数组中的某个对象,则情况不同:

someArray['key']?
将转换为:

someArray['key'] != null
截图来自:



关键字
不等于
=,如果您习惯了javascript,可能更容易阅读。相当于
==,而不是
=这是最具体的答案-许多其他答案也与空值交互。Thx@MischaArefiev
=
在咖啡中,翻译成
==在JavaScript中。实际上它只生成
项!=null
@Pencilcheck-这是因为编译器确定该项已在代码中定义。(还有一个很好的名字——虽然现在对我来说是平板电脑检查:)这个答案还提取了与未定义值非常不同的空值。这似乎是对另一个问题的回答IMHO@Seth是的,我一直被这种细微差别所困扰,这就引出了下一个逻辑问题:CS是否为以下内容提供了语法捷径:MyVariable=MyMethod;如果MyVariable?。。。其中MyMethod可能返回未定义的
?或者如果myVariable的typeof不是'undefined'
,你必须求助于
?@neverfox就我所知是后者(undefined type check)-CoffeeScript认为null和undefined应该合并。@Seth,不是真的。非严格比较(
=
!=
)实际上将
空值
未定义
视为相等的值,因此
项!=null实际上同时测试
null
undefined
。如果它写为
item!==null
。我更喜欢这种方法,只要
myVariable
不允许像
null
0
这样的错误值。使用这种习惯用法,任何错误值都将返回“val”,而不是它应该返回的值-包括
'
0.0
false
。这可能不是不需要的。您正在检查密钥是否存在,因此这是有意义的。如果还需要检查数组是否存在,请尝试使用someArray?['key']?另请参阅try
If MyVariable isnotefined
,它会生成
If(MyVariable!==void 0)
。这是旧的咖啡脚本。
变量?
现在只编译为变量!=null@Gambai你确定?该网站仍然显示
…=空
是的,编译器现在有时会忽略!=未定义为优化,因为变量应在代码中的某个位置定义。我说应该,因为编译器并不总是正确工作…@Suzana_K很高兴知道。我相信遇到这个问题的人会想要一个最新的答案,请随意编辑我的答案或发布一个新的答案,我会从我的顶部链接到它。在采用ES6/TypeScript之后,我不再使用CoffeeScript,因此无法更新答案。实际上,杰德的回答似乎涵盖了这一点:
someArray['key']?
someArray['key'] != null