javascript中Boolean_Object与Boolean_Primitives

先看下面的脚本,预测下结果

1
2
3
4
5
6
var flag = true;
console.log(typeof(flag));//boolean
var fa = Boolean(true);
console.log(typeof(fa));//boolean
var ff = new Boolean(true);
console.log(typeof(ff)); //Object

在 jslint中明确提示 new Boolean(true);do not use Boolean as a constructor. (W053)jshint(W053)

接下来的例子

1
2
3
4
5
6
7
8
9
if(flag){
console.log("true is true");
}
if(fa){
console.log("Boolean is true");
}
if(ff){
console.log("Object Boolean is true");
}

结果如下

1
2
3
true is true
Boolean is true
Object Boolean is true

修改脚本:

1
2
3
4
5
6
var flag = true;
console.log(typeof(false));//boolean
var fa = Boolean(false);
console.log(typeof(fa));//boolean
var ff = new Boolean(false);
console.log(typeof(ff)); //Object

结果竟然显示:

1
Object Boolean is true

后来查阅资料发现,

JavaScript的其他数据类型都可以转换成Boolean类型,注意!!!只有这几种类型会转换为false

1
2
3
4
5
6
undefined
null
0
-0
NaN
"" (空字符串)

其他都转化为true,包括空对象{},空数组[] , 负数 ,false的对象包装等。

1
2
3
4
5
6
7
8
9
10
11
12
if(-1){
console.log('-1转换为true');
}
if({}){
console.log('{}转换为true');
}
if([]){
console.log('[]转换为true');
}
if(new Boolean(false)){
console.log('new Boolean(false)转换为true');
}

new Boolean(false)是布尔值的包装对象 typeof (new Boolean(false)) // ‘object’ ,所以 转换为boolean是true,而不是false。

从另一个层面也证明了为啥jslint 禁止在构造方法里使用Boolean类型的数据。

后记

Boolean.valueOf() 可以返回Boolean对象对应的值类型

1
2
3
4
/**/
if(ff.valueOf()){
console.log("Object Boolean is true");
}

补充

对于数字0 连续使用两次!! 仍旧返回false.

1
2
3
var fa = Boolean(0);
console.log(fa); //false
console.log(!!0);//false

参考文章

  1. JavaScript Boolean( new Boolean(false) ) 其实是true

  2. The Difference Between Boolean Objects and Boolean Primitives in JavaScript

坚持原创技术分享,您的支持将鼓励我继续创作!