上图先:
然后举栗子:
题目:计算
[' '] == false
首先,两个操作数分别是对象类型,布尔类型,根据图1,需要将对象类型转为原始类型:
- 首先调用[].valueOf(),由于数组的valueOf()方法返回自身,所以结果不是原始类型,继续调用[].toString().
- 对于数组来说,toString()方法的算法是将每个元素都转为字符串类型,然后用逗号依次连接起来,所以最终的结果是空字符串'',它是一个原始类型的值.
实际上,运行的可以相当于下列程序代码:
var obj = {x: 1};
Number(obj) // NaN
// 等同于
if (typeof obj.valueOf() === 'object') {
Number(obj.toString());
} else {
Number(obj.valueOf());
}
上面代码中,Number函数将obj对象转为数值。背后发生了一连串的操作,首先调用obj.valueOf方法, 结果返回对象本身;于是,继续调用obj.toString方法,这时返回字符串[object Object],对这个字符串使用Number函数,得到NaN。
默认情况下,对象的valueOf方法返回对象本身,所以一般总是会调用toString方法,而toString方法返回对象的类型字符串(比如[object Object])。所以,会有下面的结果。
此时,表达式变为:
' ' == 0
到底为值,两个操作数的类型终于相同了,结果明显是true.
从这个例子可以看出,要想掌握==运算的规则,除了牢记图一外,还要记住那些内置对象的toString()和valueOf()方法的规则.包括Object,Array,Date,Number,String,Boolean等.
将图1完善下:
总结一下==运算的规则:
- undefined == null,结果是true.且它俩与素有其他值比较的结果都是false.
- String == Boolean,需要两个操作数同时转为Number.
- String/Boolean == Number,需要String/Boolean转为Number.
- Object == Primitive,需要Object转为Primitive(具体通过valueOf()和toString()方法)