Javascript中valueOf與toString區(qū)別淺析
前言
基本上,所有JS數(shù)據(jù)類型都擁有這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題,重寫會加大它們調(diào)用的優(yōu)化。
測試分析
先看一例:
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
之所以有這樣的結(jié)果,因為它們偷偷地調(diào)用valueOf或toString方法。
但如何區(qū)分什么情況下是調(diào)用了哪個方法呢,我們可以通過另一個方法測試一下。
由于用到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
結(jié)果給人的感覺是,如果轉(zhuǎn)換為字符串時調(diào)用toString方法,如果是轉(zhuǎn)換為數(shù)值時則調(diào)用valueOf方法,但其中有兩個很不和諧。一個是alert(''+bbb),字符串合拼應該是調(diào)用toString方法……另一個我們暫時可以理解為===操作符不進行隱式轉(zhuǎn)換,因此不調(diào)用它們。為了追究真相,我們需要更嚴謹?shù)膶嶒灐?BR>
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
發(fā)現(xiàn)有點不同吧?!它沒有像上面toString那樣統(tǒng)一規(guī)整。
對于那個[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
總結(jié):valueOf偏向于運算,toString偏向于顯示。
1、 在進行對象轉(zhuǎn)換時(例如:alert(a)),將優(yōu)先調(diào)用toString方法,如若沒有重寫toString將調(diào)用valueOf方法,如果兩方法都不沒有重寫,但按Object的toString輸出。
2、 在進行強轉(zhuǎn)字符串類型時將優(yōu)先調(diào)用toString方法,強轉(zhuǎn)為數(shù)字時優(yōu)先調(diào)用valueOf。
3、 在有運算操作符的情況下,valueOf的優(yōu)先級高于toString。
- JavaScript中的toString()和toLocaleString()方法的區(qū)別
- JavaScript中valueOf函數(shù)與toString方法深入理解
- 判斷js中各種數(shù)據(jù)的類型方法之typeof與0bject.prototype.toString講解
- JavaScript中Object.prototype.toString方法的原理
- 淺談JS中String()與 .toString()的區(qū)別
- javascript中tostring()和valueof()的用法及兩者的區(qū)別
- js中toString()和String()區(qū)別詳解
- JavaScript中toString()方法的使用詳解
- javascript中Number對象的toString()方法分析
- JavaScript中的object轉(zhuǎn)換函數(shù)toString()與valueOf()介紹
- JavaScript中toLocaleString()和toString()的區(qū)別實例分析
相關(guān)文章
uniapp頁面通訊講解之uni.$emit、uni.$on、uni.$once和uni.$off
uni-app?是一個使用vue.js開發(fā)所有前端應用的框架,下面這篇文章主要給大家介紹了關(guān)于uniapp頁面通訊之uni.$emit、uni.$on、uni.$once和uni.$off的相關(guān)資料,需要的朋友可以參考下2022-09-09Bootstrap實現(xiàn)的經(jīng)典柵格布局效果實例【附demo源碼】
這篇文章主要介紹了Bootstrap實現(xiàn)的經(jīng)典柵格布局效果,結(jié)合具體實例形式分析了基于BootStrap實現(xiàn)柵格布局的完整步驟與相關(guān)操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-03-03Nautil 中使用雙向數(shù)據(jù)綁定的實現(xiàn)
這篇文章主要介紹了Nautil 中使用雙向數(shù)據(jù)綁定的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10JavaScript reduce和reduceRight詳解
這篇文章主要介紹了JavaScript reduce和reduceRight的高級用法詳解的相關(guān)資料,需要的朋友可以參考下2016-10-10編寫更好的JavaScript條件式和匹配條件的技巧(小結(jié))
這篇文章主要介紹了編寫更好的JavaScript條件式和匹配條件的技巧(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-06-06JS 中LocalStorage和SessionStorage的使用
最近因為項目上需要使用到客戶端存儲,所以稍微研究了一下,以下說說自己的理解和使用經(jīng)驗,特此分享到腳本之家平臺,感興趣的朋友參考下吧2017-08-08