浅析toString与valueOf

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挪用递次

 哪一个修正先挪用哪一个

总结:

  1. 举行对象转换时(alert(e2)),优先挪用toString要领,如没有重写toString将挪用valueOf要领,假如两要领都不没有重写,但按Object的toString输出。

  2. 举行强转字符串范例时将优先挪用toString要领,强转为数字时优先挪用valueOf。

  3. 在有运算操作符的状况下,valueOf的优先级高于toString。

    原文作者:Caraxiong
    原文地址: https://segmentfault.com/a/1190000009132264
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞