浅析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 ===操作符不进行隐式转换

 

总结:

  1. 进行对象转换时(alert(e2)),将优先调用toString方法,如若没有重写toString将调用valueOf方法,如果两方法都不没有重写,但按Object的toString输出。
  2. 在进行强转字符串类型时将优先调用toString方法,强转为数字时优先调用valueOf。
  3. 在有运算操作符的情况下,valueOf的优先级高于toString。
posted @ 2017-04-19 14:20  Caraxiong  阅读(140)  评论(0编辑  收藏  举报