Chipmunk & Panda

-- 鼠熊部落格

All work and no play makes Jack a dull boy.

JavaScript 布尔操作符的短路特性

JavaScript 中布尔操作符包括逻辑非、逻辑与、逻辑或,其中,逻辑与、逻辑或具有短路特性,即若第一个操作数决定了结果,则不再对第二个操作数求值。

逻辑与

逻辑与表示为 &&,仅当两操作数均为 true 时返回 true,否则返回 false。当有操作数不是布尔值时,逻辑与并不一定返回布尔值,而是遵循如下规则:

  • 若第一个操作数是对象,则返回第二个操作数。
  • 若第二个数是对象,则仅当第一个操作数求值为 true 时返回该对象。
  • 若两个操作数均为对象,则返回第二个操作数。
  • 若任一操作数为 null / NaN / undefined,则返回 null / NaN / undefined

对于逻辑与操作符,当第一个操作数为 false,则直接忽略第二个操作数。

1
2
3
console.log(true && someUndeclaredVariable) // 报错:变量未定义

console.log(false && someUndeclaredVariable) // false

逻辑或

逻辑或表示为 ||,仅当两操作数均为 false 时返回 false,否则返回 true。当有操作数不是布尔值时,逻辑或并不一定返回布尔值,而是遵循如下规则:

  • 若第一个操作数是对象,则返回第一个操作数。
  • 若第一个对象求值为 false,则返回第二个操作数。
  • 若两个操作数均为对象,则返回第一个操作数。
  • 若两操作数均为 null / NaN / undefined,则返回 null / NaN / undefined

对于逻辑或操作符,当第一个操作数为 true,则直接忽略第二个操作数。

1
2
3
console.log(false || someUndeclaredVariable) // 报错:变量未定义

console.log(true || someUndeclaredVariable) // true

短路特性用于变量赋值

说明

利用逻辑与、逻辑或的短路特性,可以选择将两个数值中非空的一个赋值给变量,以逻辑或为例:

1
let result = first || second

first 非空,则将其赋值给 result,否则会将 second 赋值给 result,即将 first 视为首选值,当首选值为空时,再考虑备选值 second

例题

1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句(A ? B : C)。

本题如果没有那堆限制,直接暴力循环或者等差数列求和公式就可以了,然而有了那堆限制,使得只能用点巧妙的方法。解法如下,使用逻辑操作符的短路特性就可以轻松解决:

1
2
3
var sumNums = function (n) {
return n > 0 && n + sumNums(n - 1)
}