引用-许海浩
valueOf():返回最适合该对象类型的原始值;
toString(): 将该对象的原始值以字符串形式返回。
这两个方法一般是交由JS去隐式调用,以满足不同的运算情况。
在数值运算里,会优先调用valueOf(),如a + b;
在字符串运算里,会优先调用toString(),如alert(c)。
上demo
var a = {
num:30
,valueOf:function(){
return this.num
}
,toString:function(){
return 0
}
}
console.log(a > 1) //true
alert(a > 1) //true
alert(a) //0
alert(a+"abc") //30abc
alert(a == 30) // true
我们再把valueOf注释掉
var a = {
num:30
// ,valueOf:function(){
// return this.num
// }
,toString:function(){
return 0
}
}
console.log(a > 1) //false
alert(a > 1) //false
alert(a) //0
alert(a+"abc") // 0abc
alert(a == 30) // false
然后把注释的改成toString
var a = {
num:30
,valueOf:function(){
return this.num
}
// ,toString:function(){
// return 0
// }
}
alert(a > 1) //true
alert(a) // [object object]
alert(a+"abc") // 30abc
alert(a == 30) // true
这说明
1 如果未重写valueOf 重写了toString 则会偏向于执行 toString
2 如果未重写toString重写了valueOf 则会偏向于执行 valueOf
3 如果重写了valueOf 和 toString 那么则偏向于执行 valueOf
ps alert(a) 不管有没有声明valueOf 走的都是toString
ps2 alert(a+”abc”) 与 alert(a == 30)是会随着上述规律执行