? 和 || 检查完全不同(但重叠)的条件。
|| 运算符的工作方式与它在 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,那么您需要?=。