浅析toString与valueOf
valueOf():返回最适合该对象类型的原始值;
toString(): 将该对象的原始值以字符串形式返回。
这两个方法一般是交由JS去隐式调用,以满足不同的运算情况。
在数值运算里,会优先调用valueOf(),在字符串运算里,会优先调用toString()。
修改过的toString与ValueOf调用顺序
哪个修改先调用哪个,都修改,先调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 ===操作符不进行隐式转换
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 ===操作符不进行隐式转换
总结:
- 进行对象转换时(alert(e2)),将优先调用toString方法,如若没有重写toString将调用valueOf方法,如果两方法都不没有重写,但按Object的toString输出。
- 在进行强转字符串类型时将优先调用toString方法,强转为数字时优先调用valueOf。
- 在有运算操作符的情况下,valueOf的优先级高于toString。
如若喜欢,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!