生活随笔
收集整理的這篇文章主要介紹了
研究一下valueOf与toString方法
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
基本上,所有JS數(shù)據(jù)類型都擁有valueOf和toString這兩個(gè)方法,null除外。它們倆解決javascript值運(yùn)算與顯示的問(wèn)題。
JavaScript 的 valueOf() 方法
valueOf() 方法可返回 Boolean 對(duì)象的原始值。
用法booleanObject.valueOf(),返回值為booleanObject 的原始布爾值。如果調(diào)用該方法的對(duì)象不是 Boolean,則拋出異常 TypeError。
| 1 | <script type="text/javascript"> |
| 2 | var?boo =?new?Boolean(false); |
| 3 | document.write(boo.valueOf()); |
以上腳本會(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)換成字符串:
| 1 | <script type="text/javascript"> |
| 2 | var?boo =?new?Boolean(true); |
| 3 | document.write(boo.toString()); |
腳本輸出:true。
先看一例:
| 3 | ????valueOf:?function() {?return?this.i+30; }, |
| 4 | ????toString:?function() {?return?this.valueOf()+10; } |
| 7 | alert(aaa > 20);?// true |
之所以有這樣的結(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)!
| 03 | ??toString:?function() { |
| 04 | ????console.log('toString'); |
| 07 | ??valueOf:?function() { |
| 08 | ????console.log('valueOf'); |
| 13 | alert(bbb);// 10 toString |
| 14 | alert(+bbb);?// 10 valueOf |
| 15 | alert(''+bbb);?// 10 valueOf |
| 16 | alert(String(bbb));?// 10 toString |
| 17 | alert(Number(bbb));?// 10? valueOf |
| 18 | alert(bbb ==?'10');?// true valueOf |
| 19 | 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)。
| 03 | ??toString:?function() { |
| 04 | ????console.log('toString'); |
| 09 | alert(aa);// 10 toString |
| 10 | alert(+aa);?// 10 toString |
| 11 | alert(''+aa);?// 10 toString |
| 12 | alert(String(aa));?// 10 toString |
| 13 | alert(Number(aa));?// 10 toString |
| 14 | alert(aa ==?'10');?// true toString |
再看valueOf。
| 03 | ???valueOf:?function() { |
| 04 | ?????console.log('valueOf'); |
| 09 | ?alert(bb);// [object Object] |
| 10 | ?alert(+bb);?// 10 valueOf |
| 11 | ?alert(''+bb);?// 10 valueOf |
| 12 | ?alert(String(bb));?// [object Object] |
| 13 | ?alert(Number(bb));?// 10 valueOf |
| 14 | ?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è)偃サ羲纯础?/p>
| 01 | Object.prototype.toString =?null; |
| 05 | ??valueOf:?function() { |
| 06 | ????console.log('valueOf'); |
| 11 | alert(cc);// 10 valueOf |
| 12 | alert(+cc);?// 10 valueOf |
| 13 | alert(''+cc);?// 10 valueOf |
| 14 | alert(String(cc));?// 10 valueOf |
| 15 | alert(Number(cc));?// 10 valueOf |
| 16 | alert(cc ==?'10');?// true valueOf |
如果只重寫(xiě)了toString,對(duì)象轉(zhuǎn)換時(shí)會(huì)無(wú)視valueOf的存在來(lái)進(jìn)行轉(zhuǎn)換。但是,如果只重寫(xiě)了valueOf方法,在要轉(zhuǎn)換為字符串的時(shí)候會(huì)優(yōu)先考慮valueOf方法。在不能調(diào)用toString的情況下,只能讓valueOf上陣了。對(duì)于那個(gè)奇怪的字符串拼接問(wèn)題,可能是出于操作符上,翻開(kāi)ECMA262-5 發(fā)現(xiàn)都有一個(gè)getValue操作。嗯,那么謎底應(yīng)該是揭開(kāi)了。重寫(xiě)會(huì)加大它們調(diào)用的優(yōu)化高,而在有操作符的情況下,valueOf的優(yōu)先級(jí)本來(lái)就比toString的高。
轉(zhuǎn)載于:https://www.cnblogs.com/andhm/archive/2011/06/12/2078657.html
總結(jié)
以上是生活随笔為你收集整理的研究一下valueOf与toString方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。