Javascript中valueOf與toString區別

來源:互聯網
上載者:User

標籤:是什麼   類型   this   疑問   test   javascrip   can   value   調用   

疑問:

  在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。

    

Javascript中valueOf與toString區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.