Coffeescript 咖啡脚本未定义
在javascript中检查变量是否从未创建过,我们只需这样做Coffeescript 咖啡脚本未定义,coffeescript,undefined,Coffeescript,Undefined,在javascript中检查变量是否从未创建过,我们只需这样做 if (typeof MyVariable !== "undefined"){ ... } 我想知道我是怎么在咖啡剧本里做到的?。。。我试着做些类似的事情 if (MyVariable?false){ ... } 但是这个检查如果MyVariable是一个函数,如果是,它将调用MyVariable(false),如果不是,它将调用void(0)或类似的东西。我只使用: if (myVariable) //do stuff
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']?另请参阅tryIf MyVariable isnotefined
,它会生成If(MyVariable!==void 0)
。这是旧的咖啡脚本。变量?
现在只编译为变量!=null@Gambai你确定?该网站仍然显示…=空
是的,编译器现在有时会忽略!=未定义为优化,因为变量应在代码中的某个位置定义。我说应该,因为编译器并不总是正确工作…@Suzana_K很高兴知道。我相信遇到这个问题的人会想要一个最新的答案,请随意编辑我的答案或发布一个新的答案,我会从我的顶部链接到它。在采用ES6/TypeScript之后,我不再使用CoffeeScript,因此无法更新答案。实际上,杰德的回答似乎涵盖了这一点:
someArray['key']?
someArray['key'] != null