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 你确定吗?网站依旧显示... !== null
coffeescript.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
不允许像 null
或 0
这样的虚假值。【参考方案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,不是真的。非严格比较(==
和!=
)实际上将null
和undefined
视为相等的值,因此item != null
实际上同时测试null
和undefined
。如果写成item !== null
,则不会。【参考方案4】:
除了上面的Jaider's answer(由于声誉不足,我无法发表评论),请注意,如果它是对象/数组中的东西,则情况不同:
someArray['key']?
将转换为:
someArray['key'] != null
截图来自js2coffee.org:
【讨论】:
您正在检查密钥是否存在,所以这是有道理的。如果还需要检查数组是否存在,试试 someArray?['key']?【参考方案5】:为什么不直接使用 OR 成语?
myVar or 'val'
因此,结果将等于 myVar,除非它未定义,在这种情况下它将等于 'val'。
【讨论】:
使用这个习语,任何虚假值都将返回 'val' 而不是它应有的值 — 包括''
、0.0
和 false
。这可能不是不需要的。【参考方案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 未定义的主要内容,如果未能解决你的问题,请参考以下文章