在未定义的变量上操作 - 空合并

noo*_*eed 0 javascript undefined null-coalescing

function add(num) { 
  var sum;
  for (var i = 1; i < num + 1; i++){
    sum = (sum || 0) + i;
  }; 
  return sum;     
}
add(9);
Run Code Online (Sandbox Code Playgroud)

什么是关键字来描述在for循环中添加到"i"时定义sum的行为?这是三元手术吗?显然第一次循环它是未定义的,所以javascript选择0.为什么?

Ric*_*ock 7

"或"运算符的||工作方式如下:

  • 如果第一个操作数是"truthy",则返回第一个操作数.
  • 否则,返回第二个操作数.

由于undefined truthy,sum || 0为零第一次循环.

我不知道这个行为有一个特定的术语.*这只是一种初始化可能尚未预先初始化的变量的简便方法.在您的示例中,在开始时初始化变量更有意义:

function add(num) { 
  var sum = 0;
  for (var i = 1; i < num + 1; i++){
    sum += i;
  }; 
  return sum;     
}
Run Code Online (Sandbox Code Playgroud)


请注意,这与条件(三元)运算符无关:

condition ? expr1 : expr2 
Run Code Online (Sandbox Code Playgroud)


*随着信贷@joews,还有就是对这种行为的一个术语:"空合并"

但请注意他的警告:

使用这种模式是一个常见的逻辑错误,其中第一个操作数可能合法地是假的.永远不要使用var a = b || c比如说0有效值的地方b.

  • 使用这种模式是一个常见的逻辑错误,其中第一个操作数可能合法地是假的.永远不要使用`var a = b || c`其中,例如,`0`是`b`的有效值. (2认同)