JavaScript 布尔操作符的短路特性
JavaScript 中布尔操作符包括逻辑非、逻辑与、逻辑或,其中,逻辑与、逻辑或具有短路特性,即若第一个操作数决定了结果,则不再对第二个操作数求值。
逻辑与
逻辑与表示为 &&,仅当两操作数均为 true 时返回 true,否则返回 false。当有操作数不是布尔值时,逻辑与并不一定返回布尔值,而是遵循如下规则:
- 若第一个操作数是对象,则返回第二个操作数。
- 若第二个数是对象,则仅当第一个操作数求值为
true时返回该对象。 - 若两个操作数均为对象,则返回第二个操作数。
- 若任一操作数为
null/NaN/undefined,则返回null/NaN/undefined。
对于逻辑与操作符,当第一个操作数为 false,则直接忽略第二个操作数。
1 | |
逻辑或
逻辑或表示为 ||,仅当两操作数均为 false 时返回 false,否则返回 true。当有操作数不是布尔值时,逻辑或并不一定返回布尔值,而是遵循如下规则:
- 若第一个操作数是对象,则返回第一个操作数。
- 若第一个对象求值为
false,则返回第二个操作数。 - 若两个操作数均为对象,则返回第一个操作数。
- 若两操作数均为
null/NaN/undefined,则返回null/NaN/undefined。
对于逻辑或操作符,当第一个操作数为 true,则直接忽略第二个操作数。
1 | |
短路特性用于变量赋值
说明
利用逻辑与、逻辑或的短路特性,可以选择将两个数值中非空的一个赋值给变量,以逻辑或为例:
1 | |
当 first 非空,则将其赋值给 result,否则会将 second 赋值给 result,即将 first 视为首选值,当首选值为空时,再考虑备选值 second。
例题
求
1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句(A ? B : C)。
本题如果没有那堆限制,直接暴力循环或者等差数列求和公式就可以了,然而有了那堆限制,使得只能用点巧妙的方法。解法如下,使用逻辑操作符的短路特性就可以轻松解决:
1 | |