Coffeescript 中的存在条件赋值运算符
Posted
技术标签:
【中文标题】Coffeescript 中的存在条件赋值运算符【英文标题】:Existential conditional assignment operators in Coffeescript 【发布时间】:2013-03-16 23:41:52 【问题描述】:在阅读 Coffeescript 文档时,我被 scant documentation on existential operators 弄糊涂了。文档说明
它 (
?=
) 也可以用于比||=
更安全的条件赋值 提供,用于处理数字或字符串的情况。
?=
和 ||=
运算符之间有什么区别?什么时候应该使用其中一个?
【问题讨论】:
【参考方案1】:?
和 ||
检查完全不同(但重叠)的条件。
||
运算符的工作方式与它在 javascript 中的工作方式完全相同,因此就||
而言,0
和 ''
之类的东西是错误的; ||
检查 JavaScript 意义上的真实性。
?
运算符在 JavaScript 中转换为 == null
,因此当 a
为 null
或 undefined
时,a ? b
仅是 b
; ?
检查 CoffeeScript 意义上的定义。
考虑这些:
for v in [false, 0, '', null, undefined, 6]
do (v) ->
a = v
a ||= 'pancakes'
console.log("#v ||= 'pancakes':", a)
for v in [false, 0, '', null, undefined, 6]
do (v) ->
a = v
a ?= 'pancakes'
console.log("#v ?= 'pancakes':", a)
第一个循环会给你五个煎饼和一个6
,第二个循环会给你一个false
、0
、''
、两个煎饼和一个6
。
演示:http://jsfiddle.net/ambiguous/PdLDe/1/
因此,如果您只想要 JavaScript 样式的行为(即 0
、false
和 ''
将被忽略),那么您可能想要 ||=
。如果您只想跳过null
和undefined
,那么您需要?=
。
【讨论】:
我认为您的意思是“#v ..”而不是“#a ..”,为什么要打印两次? @NickSotiros:我认为你是对的,console.log
调用中的字符串应该(现在确实)使用#v
,而第二个参数应该是a
。感谢您的提醒。以上是关于Coffeescript 中的存在条件赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章