JavaScript变量回退

时间:2012-03-06 15:07:35

标签: javascript variables fallback

请有人向我解释这行代码的作用:

var list  = calls[ev] || (calls[ev] = {});

我最好的猜测:

它使用calls.xxx的值设置变量“list”,其中xxx是变量ev。如果调用[ev]不存在,那么它将其创建为空对象并将该空对象分配给“list”。是吗?

为什么要使用括号?我在哪里可以找到有关使用||的更多信息何时设置变量,并在此上下文中使用括号?谢谢!

4 个答案:

答案 0 :(得分:11)

此代码相当于

var list;
if (calls[ev])
  list = calls[ev];
else {
  calls[ev] = {};
  list = calls[ev];
}

使用该语言的两个功能:

  1. 布尔表达式的快捷方式计算(考虑a || b。如果atrue,则不评估b。因此,如果您将var v = a || b;a评估分配给可以转换为true的内容,则不会评估b
  2. 赋值语句的计算结果为最后指定的值(启用var a = b = c;
  3. 括号是避免这种解释的必要条件:

    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命名空间的常见模式。它用于确保您不会覆盖具有相同名称的先前对象。大多数流行的库都会做类似的事情来创建它们的命名空间对象。

括号在那里,以便以正确的顺序评估表达式。