JS-数据类型-布尔值boolean

2019-06-13  本文已影响0人  chrisghb

参考文章:布尔值

布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示。布尔值只有这两个值。

下列运算符会返回布尔值:

  1. 前置逻辑运算符: ! (Not)
  2. 相等运算符:===,!==,==,!=
  3. 比较运算符:>,>=,<,<=

如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true

  1. undefined
  2. null
  3. false
  4. 0
  5. NaN
  6. ""或''(空字符串)
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条件里面需要传入布尔值,所以''被自动转换成了对应的Booleanfalse,导致程序不会进入代码块,所以没有任何输出。

if ([]) {
  console.log('true');
}
// true

if ({}) {
  console.log('true');
}
// true
true && true; // 这个&&语句计算结果为true
true && false; // 这个&&语句计算结果为false
false && true && false; // 这个&&语句计算结果为false
false || false; // 这个||语句计算结果为false
true || false; // 这个||语句计算结果为true
false || true || false; // 这个||语句计算结果为true
! true; // 结果为false
! false; // 结果为true
! (2 > 5); // 结果为true
false == 0; // true
false === 0; // false

第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;

第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。

由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。

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
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
上一篇 下一篇

猜你喜欢

热点阅读