Skip to main content

布尔操作符

对于编程语言来说, 布尔操作符跟相等操作符几乎同样重要。 如果没有能力测试两个值得关系,那么像 if-else 和循环这样得语句也没有什么用。

布尔操作符一共有三个: 逻辑非(!),逻辑与(&&),逻辑或(||)

逻辑非

逻辑非由一个叹号(!)表示,可应用给ECMAScript中的任何值。这个操作符始终返回布尔值,无论应用到的是什么数据类型。

逻辑非操作符首先将操作数转换为布尔值,然后在对其取反。

逻辑非操作符会遵循如下规则:

  • 如果操作数是对象,则返回 false
  • 如果操作数是空字符串,则返回 true
  • 如果操作数是非空字符串,则返回 false
  • 如果操作数是数值0,则返回 true
  • 如果操作数是非0数值(包括Infinity),则返回 false
  • 如果操作数是null,则返回 true
  • 如果操作数是NaN,则返回 true
  • 如果操作数是undefined,则返回 true
console.log(!{}); //false;
console.log(!""); //true;
console.log(!"blue"); //false;
console.log(!0); //true
console.log(!12345); //false
console.log(!null); //true
console.log(!NaN); //true
console.log(!undefined); //true

逻辑非操作符也可以用于把任意值转换为布尔值。同时使用两个叹号(!!),相当于调用了 转型函数Boolean()

console.log(!!"blue"); //true
console.log(!!0); //false
console.log(!!NaN); //false
console.log(!!""); //false
console.log(!!12345); //true

逻辑与

逻辑与操作符由 两个AND符号(&&)表示, 如下所示:

let result = true && false;
第一个操作数第二个操作数结果
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

逻辑与操作符可用于任何类型的操作数,不限于布尔值。

如果有操作数不是布尔值,则逻辑与并一定会返回布尔值, 而是遵循如下规则:

  • 如果第一个操作数是对象,则返回第二个操作数
  • 如果第二操作是对象,则只有第二个操作数求值为 true 才会返回该对象。
  • 如果两个操作数都是对象,则返回第二个操作数。
  • 如果有一个操作数是null,则返回null
  • 如果有一个操作数是NaN,则返回NaN
  • 如果有一个操作数是undefined,则返回undefined

逻辑与操作符是一种短路操作符,如果第一个操作数是 false,那么无论第二个操作数是什么值,结果也不可能等于 true

let found = true;
let result = (found&&someUndeclaredVariable) //Error ReferenceError: someUndeclaredVariable is not defined
console.log(result); //出错了所以不会执行这一行

上面的代码之所以会出错,是因为 someUndeclaredVariable 没有事先定义 ,所以当逻辑与操作符对他求值的时候就会报错。 变量 found 的值是 true,逻辑与操作符会继续求值变量someUndeclaredVariable,由于someUndeclaredVariable没有定义,因此就报错了

let found = false;
let result = (found&&someUndeclaredVariable) //不会出错
console.log(result); //成功执行

这里,console.log会成功执行。即使变量 someUndeclaredVariable 没有定义,由于第一个操作数是 false, 所以逻辑与操作符不会对第二个操作数进行求值

逻辑或

逻辑或操作符由 两个OR符号(||)表示, 如下所示:

let result = true || false;
第一个操作数第二个操作数结果
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

逻辑与操作符遵循如下规则:

  • 如果第一个操作数是对象,则返回第一个操作数
  • 如果第一个操作数是 false,则返回第二个操作数
  • 如果两个操作数都是对象,则返回第一个操作数。
  • 如果两个操作数是null,则返回null
  • 如果两个操作数是NaN,则返回NaN
  • 如果两个操作数都是undefined,则返回undefined

和逻辑与类似,逻辑或操作符也具有短路的特性。只不过对逻辑或而言, 第一个操作数求值为 true,第二个操作数就不会被在求值了。

let found = true;
let result = (found || someUndeclaredVariable) //不会出错
console.log(result); //成功执行

变量 someUndeclaredVariable 没有事先定义,变量 found 的值是 true,所以逻辑或操作符不会继续求值变量 someUndeclaredVariable, 直接返回 true

let found = false;
let result = (found || someUndeclaredVariable) // Error ReferenceError: someUndeclaredVariable is not defined
console.log(result); // 出错了所以不会执行这一行