参考文章:布尔值
布尔值代表“真”和“假”两个状态。“真”用关键字true
表示,“假”用关键字false
表示。布尔值只有这两个值。
下列运算符会返回布尔值:
- 前置逻辑运算符: ! (Not)
- 相等运算符:===,!==,==,!=
- 比较运算符:>,>=,<,<=
如果 JavaScript
预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false
,其他值都视为true
。
- undefined
- null
- false
- 0
- NaN
- ""或''(空字符串)
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean('') // false
Boolean(NaN) // false
Boolean(1) // true
Boolean('false') // true
Boolean([]) // true
Boolean({}) // true
Boolean(function () {}) // true
Boolean(/foo/) // true
- 布尔值往往用于程序流程的控制,请看一个例子。
if ('') {
console.log('true');
}
// 没有任何输出
上面代码中,if
条件里面需要传入布尔值,所以''
被自动转换成了对应的Boolean
值false
,导致程序不会进入代码块,所以没有任何输出。
- 注意,空数组([])和空对象({})对应的布尔值,都是
true
。
if ([]) {
console.log('true');
}
// true
if ({}) {
console.log('true');
}
// true
-
&&
运算是与运算,只有所有都为true
,&&
运算结果才是true
:
true && true; // 这个&&语句计算结果为true
true && false; // 这个&&语句计算结果为false
false && true && false; // 这个&&语句计算结果为false
-
||
运算是或运算,只要其中有一个为true
,||
运算结果就是true
:
false || false; // 这个||语句计算结果为false
true || false; // 这个||语句计算结果为true
false || true || false; // 这个||语句计算结果为true
-
!
运算是非运算,它是一个单目运算符,把true
变成false
,false
变成true
:
! true; // 结果为false
! false; // 结果为true
! (2 > 5); // 结果为true
- 实际上,
JavaScript
允许对任意数据类型做比较:
false == 0; // true
false === 0; // false
- 要特别注意相等运算符
==
。JavaScript
在设计时,有两种比较运算符:
第一种是==
比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
第二种是===
比较,它不会自动转换数据类型,如果数据类型不一致,返回false
,如果一致,再比较。
由于JavaScript
这个设计缺陷,不要使用==
比较,始终坚持使用===
比较。
- 另一个例外是
NaN
这个特殊的Number
与所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判断NaN
的方法是通过isNaN()
函数:
isNaN(NaN); // true
- 要注意浮点数的相等比较:
1 / 3 === (1 - 2 / 3); // false
这不是JavaScript
的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
- 要将一个值转换为对应的Boolean值,可以调用转型函数Boolean():
var message = "Hello world!";
var messageAsBoolean = Boolean(message);
console.log(messageAsBoolean); //true
对于一些特殊值,Boolean
对象前面加不加new
,会得到完全相反的结果,必须小心。
if (Boolean(false)) {
console.log('true');
} // 无输出
if (new Boolean(false)) {
console.log('true');
} // true
if (Boolean(null)) {
console.log('true');
} // 无输出
if (new Boolean(null)) {
console.log('true');
} // true
- 顺便提一下,使用双重的否运算符(!)也可以将任意值转为对应的布尔值。
!!undefined // false
!!null // false
!!0 // false
!!'' // false
!!NaN // false
!!1 // true
!!'false' // true
!![] // true
!!{} // true
!!function(){} // true
!!/foo/ // true
网友评论