JavaScript 的布尔操作符

320 阅读4分钟

JavaScript 中包含三种布尔操作符:逻辑非(!),逻辑与(&&),逻辑或(||)。

逻辑非

逻辑非操作符 由一个叹号(!)表示,可应用给ECMAScript中的任何值。这个操作符始终返回布尔值,无论应用到的是什么数据类型。逻辑非操作符首先将操作符转换为布尔值,然后再对其取反。
换句话说,逻辑非操作符会遵循如下规则:
1. 如果操作数是对象,则返回false。
2. 如果操作数是空字符串,则返回true。
3. 如果操作数是非空字符串,则返回false。
4. 如果操作数是数值0,则返回true。
5. 如果操作数是非0数值(包括Infinity),则返回false。
6. 如果操作数是null,则返回true。
7. 如果操作数是NaN,则返回true。
8. 如果操作数是undefined,则返回true。

逻辑非操作符也可以用于把人意值转换为布尔值。同时使用两个叹号(!),相当于调用了转型函数Boolean().无论操作数是什么类型,第一个叹号总会返回布尔值。第二个叹号对该布尔值取反,从而给出变量真正对应的布尔值。结果与对同一个值使用Boolean()函数是一样的。

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

逻辑与

逻辑与操作符由两个和号(&&)表示,应用到两个值:

let result = true && false;

操作符结果与结果对照关系如下:

第一个操作数第二个操作数结果
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

逻辑与操作符可用于任何类型的操作数,不局限于布尔值。如果有操作数不是布尔值,则逻辑与并不一定会返回布尔值,而是遵循如下规则:
1.如果第一个操作数是对象,则返回第二个操作数。

console.log({name:"wang"} && false);//false
console.log({name:"wang"} && {other:"pp"}); // {other: 'pp'}

2.如果第二个操作数是对象,则只有第一个操作数求值为true才会返回该对象。

console.log(false && { name: "wang" }); // false
console.log(true && { other: "pp" }); //{ other: "pp" }

3.如果两个操作数都是对象,则返回第二个操作数。

console.log({name:"wang"} && {other:"pp"}); // {other: 'pp'}

4.如果有一个操作数是null,则返回null。

5.如果有一个操作数是NaN,则返回NaN。

6.如果有一个操作数是undefied,则返回undefined。 逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。对逻辑与操作符来说,如果第一个操作数是false,那么无论第二个操作数是什么值,结果也不可能等于true。

let found = true;
let result = (found && somUndeclarerdVariable);// 报错,由于found为true,会进行第二个操作数的求值
console.log(result); // 不会执行


let found = false;
let result = (found && somUndeclarerdVariable);// 短路,不会报错,由于found为false,不会进行第二个操作数的求值
console.log(result); // 会执行 false

逻辑或

逻辑或操作符由两个管道符(||)表示

let result = true || false;

操作符结果与结果对照关系如下:

第一个操作数第二个操作数结果
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

与逻辑与类似,如果有一个操作数不是布尔值,那么逻辑或操作符也不一定返回布尔值。它遵循如下规则。

1. 如果第一个操作数是对象,则返回第一个操作数。
2. 如果第一个操作数求值为false,则返回第二个操作数。
3. 如果两个操作数都是对象,则返回第一个操作数。
4. 如果两个操作数都是null,则返回null。
5. 如果两个操作数都是NaN,则返回NaN。
6. 如果两个操作数都是udefinded,则返回undefined.

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

let found = true;
let result = (found || somUndeclarerdVariable);// 短路,不会报错,由于found为true,不会进行第二个操作数的求值
console.log(result); // 会执行


let found = false;
let result = (found && somUndeclarerdVariable);// 会报错,由于found为false,会进行第二个操作数的求值
console.log(result); // 不会执行

利用这个特性,可以避免给变量赋值为null或undefined。

let myObject = preferredObject || backupObject;