全面解析JavaScript中的valueOf與toString方法(推薦)
可以這樣說(shuō),所有JS數(shù)據(jù)類型都擁有valueOf和toString這兩個(gè)方法,null除外。它們倆解決javascript值運(yùn)算與顯示的問(wèn)題。在程序應(yīng)用非常廣泛。下面我們逐一來(lái)給大家介紹下。
JavaScript 的 valueOf() 方法
valueOf() 方法可返回 Boolean 對(duì)象的原始值。
用法booleanObject.valueOf(),返回值為booleanObject 的原始布爾值。如果調(diào)用該方法的對(duì)象不是 Boolean,則拋出異常 TypeError。
<script type="text/javascript"> var boo = new Boolean(false); document.write(boo.valueOf()); </script>
以上腳本會(huì)輸出false。
JavaScript 的 toString() 方法
toString() 方法可把一個(gè)邏輯值轉(zhuǎn)換為字符串,并返回結(jié)果。
用法 booleanObject.toString(),返回值根據(jù)原始布爾值或者 booleanObject 對(duì)象的值返回字符串 "true" 或 "false"。如果調(diào)用該方法的對(duì)象不是 Boolean,則拋出異常 TypeError。
在 Boolean 對(duì)象被用于字符串環(huán)境中時(shí),此方法會(huì)被自動(dòng)調(diào)用。
下面腳本將創(chuàng)建一個(gè) Boolean 對(duì)象,并把它轉(zhuǎn)換成字符串:
<script type="text/javascript"> var boo = new Boolean(true); document.write(boo.toString()); </script>
腳本輸出:true。
先看一例:
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é)果,因?yàn)樗鼈兺低档卣{(diào)用valueOf或toString方法。但如何區(qū)分什么情況下是調(diào)用了哪個(gè)方法呢,我們可以通過(guò)另一個(gè)方法測(cè)試一下。由于用到console.log,請(qǐng)?jiān)谘b有firebug的FF中實(shí)驗(yàn)!
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é)果,大抵給人的感覺(jué)是,如果轉(zhuǎn)換為字符串時(shí)調(diào)用toString方法,如果是轉(zhuǎn)換為數(shù)值時(shí)則調(diào)用valueOf方法,但其中有兩個(gè)很不和諧。一個(gè)是alert(''+bbb),字符串合拼應(yīng)該是調(diào)用toString方法……另一個(gè)我們暫時(shí)可以理解為===操作符不進(jìn)行隱式轉(zhuǎn)換,因此不調(diào)用它們。為了追究真相,我們需要更嚴(yán)謹(jǐn)?shù)膶?shí)驗(yàn)。
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)有點(diǎn)不同吧?!它沒(méi)有像上面toString那樣統(tǒng)一規(guī)整。對(duì)于那個(gè)[object Object],我估計(jì)是從Object那里繼承過(guò)來(lái)的,我們?cè)偃サ羲纯础?br />
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
如果只重寫了toString,對(duì)象轉(zhuǎn)換時(shí)會(huì)無(wú)視valueOf的存在來(lái)進(jìn)行轉(zhuǎn)換。但是,如果只重寫了valueOf方法,在要轉(zhuǎn)換為字符串的時(shí)候會(huì)優(yōu)先考慮valueOf方法。在不能調(diào)用toString的情況下,只能讓valueOf上陣了。對(duì)于那個(gè)奇怪的字符串拼接問(wèn)題,可能是出于操作符上,翻開ECMA262-5 發(fā)現(xiàn)都有一個(gè)getValue操作。嗯,那么謎底應(yīng)該是揭開了。重寫會(huì)加大它們調(diào)用的優(yōu)化高,而在有操作符的情況下,valueOf的優(yōu)先級(jí)本來(lái)就比toString的高。
以上所述是小編給大家介紹的JavaScript中的valueOf與toString方法的全部敘述,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- JavaScript函數(shù)中關(guān)于valueOf和toString的理解
- JavaScript中Object.prototype.toString方法的原理
- JavaScript的Number對(duì)象的toString()方法
- javascript中tostring()和valueof()的用法及兩者的區(qū)別
- JavaScript中toString()方法的使用詳解
- node.js中的buffer.toString方法使用說(shuō)明
- 非常好用的JsonToString 方法 簡(jiǎn)單實(shí)例
- Javascript中valueOf與toString區(qū)別淺析
- 淺談JS中String()與 .toString()的區(qū)別
相關(guān)文章
Js通過(guò)AES加密后PHP用Openssl解密的方法
這篇文章主要給大家介紹了關(guān)于Js如何通過(guò)AES加密后PHP利用Openssl解密的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
javascript 可控式透明特效實(shí)現(xiàn)代碼
透明特效是script.aculo.us提到的特效中最簡(jiǎn)單的特效之一。既然是特效,必須涉及時(shí)間與空間的概念。時(shí)間我們可以用setTimeout與setInterval,個(gè)人比較喜歡setTimeout,雖然它每次調(diào)用都重復(fù)注冊(cè),但可控性比較好。2010-01-01
javascript簡(jiǎn)寫常用的12個(gè)技巧(可以大大減少你的js代碼量)
這篇文章主要跟大家分享了javascript簡(jiǎn)寫常用的12個(gè)技巧,通過(guò)這12個(gè)技巧可以大大減少你的js代碼量,看懂一種是入門,全懂就是大神,你能知道幾個(gè)呢?需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。2017-08-08
利用JS輕松實(shí)現(xiàn)獲取表單數(shù)據(jù)
本文主要介紹了利用JS輕松實(shí)現(xiàn)獲取表單數(shù)據(jù)。方法有別于原始的做法,大家可以試著找原始做法與本文所說(shuō)方法之間的區(qū)別。有興趣的朋友可以看下,希望對(duì)大家有所幫助2016-12-12
layer.open屬性詳解及l(fā)ayer.open彈出框使用post方法舉例
這篇文章主要給大家介紹了關(guān)于layer.open屬性詳解及l(fā)ayer.open彈出框使用post方法的相關(guān)資料,最近接觸到layer彈窗,感覺(jué)彈窗功能異常強(qiáng)大,真的很方便,所以記錄下來(lái),需要的朋友可以參考下2023-12-12
Javascript es7中比較實(shí)用的兩個(gè)方法示例
這篇文章主要給大家分享了關(guān)于Javascript es7中比較實(shí)用的兩個(gè)方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07
JavaScript數(shù)組中reduce方法的應(yīng)用詳解
JavaScript 中的reduce()方法可以用于將數(shù)組元素匯總為單個(gè)值,,所以本文為大家整理了一些JavaScript數(shù)組中reduce方法的應(yīng)用,需要的可以參考一下2023-07-07

