js 中的 !!

基本类型的布尔值 true、false 和 值为 true、 false 的 Boolean 对象是不同的

 1 var b = undefined
 2 
 3 var base_b = Boolean(b);
 4 console.log(base_b);
 5 // false
 6 console.log(typeof base_b);
 7 // boolean
 8 
 9 var obj_b = new Boolean(b);
10 console.log(obj_b);
11 // Boolean {false}
12 console.log(typeof obj_b);
13 // object
14 
15 if(base_b){
16   // 这里的代码 不 会执行  
17 }
18 
19 if(obj_b){
20   // 这里的代码 会 执行, obj_b 是个非 null 的对象  
21 }

基本类型

0 -0 NaN false null ''(空字符串) undefined 被转化为布尔值时,皆为 false 

[] {} 空数组,空对象 都是 true, 除去上行 false 的情况,皆 true 

Boolean 对象

var b = new Boolean()

不传值,或者 0 -0 NaN false null '' undefined 会得到 Boolean{ false }, 即值为 false 的Boolean对象

任何不是 null 和 undefined 的对象都会被当做 true 来处理, 即使是 值为 false 的 Boolean 对象

!

var b = 'hello world';

console.log( !b )  // false

! 的作用是,将 b 转为布尔值,并取反

结合上文,当 b  0 -0 NaN false null ''(空字符串) undefined 时,!b 是 true

!!

var b = 'hello world'

console.log( !!b )  // true

在 ! 的基础上再次取反(!),其实相当于只是强转为 布尔值.. 等价于 Boolean(b),写法上更简洁

结合上文,当 b 不是 0 -0 NaN false null ''(空字符串) undefined 时,!!b 是 true

我自己的感觉,!! 是道保险,保证这个值是布尔值。其实如果是写在条件语句中的话,会默认进行隐式类型转换,与不加 !! 效果应该是一样的

如有错误,望指正