valueOf():返回最适合该对象范例的原始值;
toString(): 将该对象的原始值以字符串情势返回。
这两个要领平常是交由JS去隐式挪用,以满足差别的运算状况。
在数值运算里,会优先挪用valueOf(),在字符串运算里,会优先挪用toString()。
let e2 = {
n : 2,
toString : function (){
console.log('this is toString')
return this.n
},
valueOf : function(){
console.log('this is valueOf')
return this.n*2
}
}
alert(e2) // 2 this is toString
alert(+e2) // 4 this is valueOf
alert(''+e2) // 4 this is valueOf
alert(String(e2)) // 2 this is toString
alert(Number(e2)) // 4 this is valueOf
alert(e2 == '4') // true this is valueOf
alert(e2 === 4) //false ===操作符不举行隐式转换
第三个alert,之所以会挪用valueOf是因为:在有运算操作符的状况下,valueOf的优先级高于toString
看接下来的两给例子:
let e3 = {
n : 2,
toString : function (){
console.log('this is toString')
return this.n
}
}
alert(e3) // 2 this is toString
alert(+e3) // 2 this is toString
alert(''+e3) // 2 this is toString
alert(String(e3)) // 2 this is toString
alert(Number(e3)) // 2 this is toString
alert(e3 == '2') // true this is toString
alert(e3 === 2) //false ===操作符不举行隐式转换
Object.prototype.toString = null;
let e4 = {
n : 2,
valueOf : function(){
console.log('this is valueOf')
return this.n*2
}
}
alert(e4) // 4 this is valueOf
alert(+e4) // 4 this is valueOf
alert(''+e4) // 4 this is valueOf
alert(String(e4)) // 4 this is valueOf
alert(Number(e4)) // 4 this is valueOf
alert(e4 == '4') // true this is valueOf
alert(e4 === 4) //false ===操作符不举行隐式转换
修悛改的toString与ValueOf挪用递次
哪一个修正先挪用哪一个
总结:
举行对象转换时(alert(e2)),优先挪用toString要领,如没有重写toString将挪用valueOf要领,假如两要领都不没有重写,但按Object的toString输出。
举行强转字符串范例时将优先挪用toString要领,强转为数字时优先挪用valueOf。
在有运算操作符的状况下,valueOf的优先级高于toString。