今天突然想比较一下 new String("a") 与 "a" 的异同; 发现
new String("a") == "a"; 成立
new String("a") === "a"; 不成立
也好理解,前者是一个对象,后者是一个字符串;不过对象是怎么和字符串做模糊比较的呢?
于是想到了toString(); 建了一个对象,重写了toString() 函数,如:
var obj = {
toString:function(){return "b";}
}
obj == "b"; 成立
于是认为对象toString()之后和字符串做比较的,和同事说了以后,同事认为应该是valueOf() 之后比较的,我想也有道理,于是做了下面的测试:var obj = {
toString : function(){
return "a";
},
valueOf : function(){
return "b";
}
};
console.log(obj == "a"); // 不成立
console.log(obj == "b"); // 成立
一般情况下,valueOf() 是对象自身,还是一个对象,和字符串比较时,还是要toString() 的; 但是我让valueOf()返回字符串,就不需要再toString() 了;
比较时确实是通过valueOf比较的
---------------------------
=== 与 == 的区别
前者要求不需是同一个,相同的地址;
后者要求类型转换后相同就行了。