JavaScript变量回退

thu*_*gsb 11 javascript variables fallback

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

var list  = calls[ev] || (calls[ev] = {});
Run Code Online (Sandbox Code Playgroud)

我最好的猜测:

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

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

Ale*_*lov 12

这段代码相当于

var list;
if (calls[ev])
  list = calls[ev];
else {
  calls[ev] = {};
  list = calls[ev];
}
Run Code Online (Sandbox Code Playgroud)

使用该语言的两个功能:

  1. 快捷布尔表达式的计算(考虑a || b,如果atrue那么b不评估).因此,如果您分配var v = a || b;a评估可以强制转换的内容true,b则不进行评估.
  2. 赋值语句求值为最后指定的值(启用var a = b = c;)

括号是避免这种解释的必要条件:

var list = (calls[ev] || calls[ev]) = {};
Run Code Online (Sandbox Code Playgroud)

(这是一个错误).


Ale*_*pin 7

你的猜测是正确的.这是在JavaScript中声明变量的"默认"值的常用方法.

function foo(bar) {
    var bar = bar || 0; //This sets bar to 0 if it's not already set
    console.log(bar);
}
Run Code Online (Sandbox Code Playgroud)

这种方法的工作方式是,在JavaScript中,未定义的变量是假的,这意味着在任何布尔比较运算中,它都会计算到false.然后,您可以使用OR运算符组合两个值,它将返回计算结果的第一个值true.


Pau*_*xon 5

||or '逻辑 OR' 的优先级高于赋值运算符=,因此必须使用括号来确保该习惯用法按正确的顺序求值

另一件需要注意的事情是,许多语言(包括 Javascript)都提供布尔运算符(如 AND 和 OR)的短路求值。如果逻辑或的第一个操作数计算为真,则无需计算第二个操作数,因为它对结果没有影响。

理解这一点,您就会发现这不是某种特殊的赋值语法,而是一种习惯用法或模式,它利用语言功能来提供更紧凑的想法表示。