Javascript中valueOf與toString區別淺析

來源:互聯網
上載者:User

前言

基本上,所有JS資料類型都擁有這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題,重寫會加大它們調用的最佳化。

測試分析

先看一例:

複製代碼 代碼如下:var aaa = {
i: 10,
valueOf: function() { return this.i+30; },
toString: function() { return this.valueOf()+10; }
}

alert(aaa > 20); // true
alert(+aaa); // 40
alert(aaa); // 50

之所以有這樣的結果,因為它們偷偷地調用valueOf或toString方法。
但如何區分什麼情況下是調用了哪個方法呢,我們可以通過另一個方法測試一下。
由於用到console.log,請在裝有firebug的FF中實驗!複製代碼 代碼如下:var bbb = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
},
valueOf: function() {
console.log('valueOf');
return this.i;
}
}

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

結果給人的感覺是,如果轉換為字串時調用toString方法,如果是轉換為數值時則調用valueOf方法,但其中有兩個很不和諧。一個是alert(''+bbb),字串合拼應該是調用toString方法……另一個我們暫時可以理解為===操作符不進行隱式轉換,因此不調用它們。為了追究真相,我們需要更嚴謹的實驗。複製代碼 代碼如下:var aa = {
i: 10,
toString: function() {
console.log('toString');
return this.i;
}
}
alert(aa);// 10 toString
alert(+aa); // 10 toString
alert(''+aa); // 10 toString
alert(String(aa)); // 10 toString
alert(Number(aa)); // 10 toString
alert(aa == '10'); // true toString

再看valueOf。複製代碼 代碼如下:var bb = {
i: 10,
valueOf: function() {
console.log('valueOf');
return this.i;
}
}

alert(bb);// [object Object]
alert(+bb); // 10 valueOf
alert(''+bb); // 10 valueOf
alert(String(bb)); // [object Object]
alert(Number(bb)); // 10 valueOf
alert(bb == '10'); // true valueOf

發現有點不同吧?!它沒有像上面toString那樣統一規整。
對於那個[object Object],我估計是從Object那裡繼承過來的,我們再去掉它看看。複製代碼 代碼如下:Object.prototype.toString = null;
var cc = {
i: 10,
valueOf: function() {
console.log('valueOf');
return this.i;
}
}

alert(cc);// 10 valueOf
alert(+cc); // 10 valueOf
alert(''+cc); // 10 valueOf
alert(String(cc)); // 10 valueOf
alert(Number(cc)); // 10 valueOf
alert(cc == '10'); // true valueOf

總結:valueOf偏向於運算,toString偏向於顯示。
1、 在進行對象轉換時(例如:alert(a)),將優先調用toString方法,如若沒有重寫toString將調用valueOf方法,如果兩方法都不沒有重寫,但按Object的toString輸出。
2、 在進行強轉字串類型時將優先調用toString方法,強轉為數字時優先調用valueOf。
3、 在有運算操作符的情況下,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.