区分Boolean()与 == 类型转换
-
在
if(condition){...}
时,condition的值来自于Boolean(condition)
的计算,Boolean()
它只会在以下6种情况为false:NaN, 0, '' , undefined, null, false
,在语法上其余情况再离谱也是true!(然鹅浏览器提供了一个东西叫“假值对象”,Boolean(document.all)
会得到false的结果) -
在使用
A == B
进行比较时,由于要同时考虑操作数AB双方的类型,又要最终返回布尔值类型,因此会发生隐式类型转换: -
==
操作的目的 往往是判断是否等值 因此倾向于转换为Number,如'123' == 123; "" == 0; 1 == true
都发生了Number()
求值,所以结果均为true; -
但是出现
null
和undefined
,则他们只会与null或undefined
等值比较得到true;可以理解为 若遇到其它人,他们Number()
的结果是NaN 与其他数值比较必然false。 -
其中操作数如果是object,则会使用
obj.toPrimitive()
转为值类型,即:先obj.valueOf()
,若还不是值类型则再obj.toString()
; -
如:
[1].valueOf() => [1]
结果还是object,[1].toString() => "[1]"
这次是基本类型非空字符串了。而[0].toString()
与[ ].toString()
得到的是"0"
与""
,因此会在等值比较中通过Number()
求值得到0。
题目:
var a = [0]; if(a) { console.log( a == true ); } else { console.log("this is else"); }
/*if中Boolean(一个数组)的结果为true,会进入第一个分支 等值比较运算 倾向于转为数值,
* a为对象 需要先valueOf(),实际上没效果 还是得到数组,再a.toString()得到非空字符串'0',
* 然后'0'被转值为0 true被转值为1,最终相当于0 == 1,答案是false
* /