zoukankan      html  css  js  c++  java
  • Javascript中valueOf与toString区别

    疑问:

      在JS的数据类型中有两个方法 Object.prototype.valueOf 和 Object.prototype.toString,在实例到这两个的区别是什么?

     我们进行如下的实例步骤:

    案例1.

        var test={
                            age:20,
                            toString:function(){return this.age-10;},   //重写 toString()
                            valueOf:function(){return this.age+40;}    //重写 valueOf()
                      }    

    运行如下代码:

                alert(test>20);//true 调用的是 valueOf
                alert(+test); //60 调用的是 valueOf
                alert(test); //10  调用的是 toString

    结论:出现这种结果是由于test在自动的调用 valueOf 或者 toString 方法.

    此时产生了新的疑问:什么情况下调用 valueOf,什么情况下调用  toString 呢?

    继续看下面的案例:

    案例2.

     var test={
                            age:20,
                            toString:function(){console.log('toString');return this.age-10;},   //重写 toString()
                            valueOf:function(){console.log('valueOf');return this.age+40;}    //重写 valueOf()
                      }    

    运行如下代码:

           alert(test);// 10 toString
                alert(+test); // 60 valueOf
                alert('' + test); // 60 valueOf
                alert(String(test)); // 10 toString
                alert(Number(test)); // 60 valueOf
                alert(test == '10'); // false valueOf
                alert(test === '10'); // false

    结论:转换成字符串时调用的是 toString,转换成数字时调用的是 valueOf,但是有两个例外:一个alert('' + test),已改调用 toString ,反而却调用的是  valueOf, 另外一个 alert(test === '10'),===操作符不进行隐式转换,因此不调用它们。

     为了弄清楚两个例外,我们继续案例:

    案例3:

    var test = {
                    age: 20,
                    toString: function () { console.log('toString'); return this.age - 10; }   //重写 toString()
                }

    运行如下代码:

            alert(test);// 10 toString
                alert(+test); // 10 toString
                alert('' + test); // 10 toString
                alert(String(test)); // 10 toString
                alert(Number(test)); // 10 toString
                alert(test == '10'); // true toString
                alert(test === '10'); // false

     结论:只重写 toString 的时候,调用的是 toString.

    案例4:

    var test = {
                    age: 20,
                    valueOf: function () { console.log('valueOf'); return this.age + 40; }    //重写 valueOf()
                }

    运行如下代码:

           alert(test);// [object object]  --继承的是 Object.prototype.toString
                alert(+test); // 60 valueOf
                alert('' + test); // 60 valueOf
                alert(String(test)); // [object object] --Object.prototype.toString
                alert(Number(test)); // 60 valueOf
                alert(test == '10'); // false valueOf
                alert(test === '10'); // false

     结论:对于那个[object Object],我估计是从Object那里继承过来的,我们再去掉它看看。

    案例5:

     Object.prototype.toString = null;
                var test = {
                    age: 20,
                    valueOf: function () { console.log('valueOf'); return this.age + 40; }    //重写 valueOf()
                }
                alert(test);// 60 valueOf
                alert(+test); // 60 valueOf
                alert('' + test); // 60 valueOf
                alert(String(test)); // 60 valueOf
                alert(Number(test)); // 60 valueOf
                alert(test == '10'); // false valueOf
                alert(test === '10'); // false

    案例6:

     var test = {
                    age: 20
                }
                alert(test);// [object object]
                alert(+test); // NaN
                alert('' + test); // [object object]
                alert(String(test)); // [object object]
                alert(Number(test)); // NaN
                alert(test == '10'); // false 
                alert(test === '10'); // false

    案例7:

    Object.prototype.toString = null;
                var test = {
                    age: 20
                }
                alert(test);//  Uncaught TypeError: Cannot convert object to primitive value
                alert(+test); // Uncaught TypeError: Cannot convert object to primitive value
                alert('' + test); // Uncaught TypeError: Cannot convert object to primitive value
                alert(String(test)); // Uncaught TypeError: Cannot convert object to primitive value
                alert(Number(test)); // Uncaught TypeError: Cannot convert object to primitive value
                alert(test == '10'); // Uncaught TypeError: Cannot convert object to primitive value 
                alert(test === '10'); //false Uncaught TypeError: Cannot convert object to primitive value

    从上面所有的案例中总结:

    1.valueOf应用于运算,toString应用于显示.

    2.在进行对象转换成字符串时(例如:alert(test)),将优先调用 toString,如果没有 toString 方法了,就调用 valueOf方法,如果tostring 和 valueOf都没重写,就按照 Object的toString 方法输出.

    3.在进行强转字符串类型时将优先调用toString方法,强转为数字时优先调用valueOf。

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

        

  • 相关阅读:
    [招聘]打造一支全球顶尖医疗影像研发团队
    WCF Service示例
    SCRUM节外生枝(四)
    SCRUM节外生枝(二)
    面试时,你会问面试官哪些问题?
    第一篇博客 依旧敏捷
    Scrum框架及其背后的原则(下)——框架背后的原则及实施过程不良症状分析[转载自InfoQ]
    参加“启动敏捷实施的5项准备”讲座的一些收获
    参加SCRUM中文网举办的第四期敏捷沙龙纪要
    视觉与错觉[转载]
  • 原文地址:https://www.cnblogs.com/huaan011/p/6634349.html
Copyright © 2011-2022 走看看