js中两个等号会进行类型转換,先转化为同类型的基础数据类型,再比较。而三个等号不会进行类型转换,如果类型不同就会直接返回false,复合类型必须是两个引用的内存是一个,才会返回true。这里我们主要想探讨一下两个等号时这个类型转換是怎么运作的。
首先,如果两边都是基础数据类型,直接转換成同类型进行比较。例如
'' == 0
前面是个string 后面是个number,所以会把string转成number再比较,这就相当于
Nubmer('') == 0
自然返回的是true。
如果是复合类型呢,会先调用valueOf(),如果valueOf返回的是一个复合类型,则会再調用返回对象的toString()方法。
看下面的例子
[] == 0
会先調用[].valueOf()。发现返回的是[]本身,再調用[].toString(), 返回'', 就跟前而的‘’==0一样了。
再看一个例子
var a = {
valueOf: function() {
console.log('valueOf is called');
return this;
},
toString: function() {
console.log('toString is called');
return 'abc';
},
};
a == 'abc';
valueOf和toString会被依次調用。
var a = {
valueOf: function() {
console.log('valueOf is called');
return 'abc';
},
toString: function() {
console.log('toString is called');
return 'bcd';
},
};
a == 'abc';
只会調用valueOf