请有人向我解释这行代码的作用:
var list = calls[ev] || (calls[ev] = {});
我最好的猜测:
它使用calls.xxx的值设置变量“list”,其中xxx是变量ev。如果调用[ev]不存在,那么它将其创建为空对象并将该空对象分配给“list”。是吗?
为什么要使用括号?我在哪里可以找到有关使用||的更多信息何时设置变量,并在此上下文中使用括号?谢谢!
答案 0 :(得分:11)
此代码相当于
var list;
if (calls[ev])
list = calls[ev];
else {
calls[ev] = {};
list = calls[ev];
}
使用该语言的两个功能:
a || b
。如果a
为true
,则不评估b
。因此,如果您将var v = a || b;
和a
评估分配给可以转换为true
的内容,则不会评估b
。var a = b = c;
)括号是避免这种解释的必要条件:
var list = (calls[ev] || calls[ev]) = {};
(这是一个错误)。
答案 1 :(得分:5)
你的猜测是正确的。这是在JavaScript中为变量声明“默认”值的常用方法。
function foo(bar) {
var bar = bar || 0; //This sets bar to 0 if it's not already set
console.log(bar);
}
这种方法的工作方式是,在JavaScript中,未定义的变量是假的,这意味着在任何布尔比较运算中,它将计算为false
。然后,您可以使用OR运算符组合两个值,它将返回第一个计算结果为true
的值。
答案 2 :(得分:1)
||
或“逻辑OR”的赋值运算符=
高precedence,因此必须使用括号来确保此惯用法以正确的顺序进行求值
要注意的另一件事是,包含Javascript的许多语言提供了short-circuit evaluation布尔运算符,如AND和OR。如果逻辑的第一个操作数或计算结果为true,则不需要计算第二个操作数,因为它对结果没有影响。
理解这一点,你会发现这不是一些特殊的赋值语法,而是一种利用语言特征来提供更紧凑的想法表达的习语或模式。
答案 3 :(得分:1)
你的第一个猜测是正确的。这是初始化javascript命名空间的常见模式。它用于确保您不会覆盖具有相同名称的先前对象。大多数流行的库都会做类似的事情来创建它们的命名空间对象。
括号在那里,以便以正确的顺序评估表达式。