日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

研究一下valueOf与toString方法

發布時間:2024/4/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 研究一下valueOf与toString方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基本上,所有JS數據類型都擁有valueOf和toString這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題。

JavaScript 的 valueOf() 方法

valueOf() 方法可返回 Boolean 對象的原始值。

用法booleanObject.valueOf(),返回值為booleanObject 的原始布爾值。如果調用該方法的對象不是 Boolean,則拋出異常 TypeError。

1<script type="text/javascript">
2var?boo =?new?Boolean(false);
3document.write(boo.valueOf());
4</script>

以上腳本會輸出false。

JavaScript 的 toString() 方法

toString() 方法可把一個邏輯值轉換為字符串,并返回結果。

用法 booleanObject.toString(),返回值根據原始布爾值或者 booleanObject 對象的值返回字符串 "true" 或 "false"。如果調用該方法的對象不是 Boolean,則拋出異常 TypeError。

在 Boolean 對象被用于字符串環境中時,此方法會被自動調用。

下面腳本將創建一個 Boolean 對象,并把它轉換成字符串:

1<script type="text/javascript">
2var?boo =?new?Boolean(true);
3document.write(boo.toString());
4</script>

腳本輸出:true。

先看一例:

1var?aaa = {
2????i: 10,
3????valueOf:?function() {?return?this.i+30; },
4????toString:?function() {?return?this.valueOf()+10; }
5}
6?
7alert(aaa > 20);?// true
8alert(+aaa);?// 40
9alert(aaa);?// 50

之所以有這樣的結果,因為它們偷偷地調用valueOf或toString方法。但如何區分什么情況下是調用了哪個方法呢,我們可以通過另一個方法測試一下。由于用到console.log,請在裝有firebug的FF中實驗!

01var?bbb = {
02??i: 10,
03??toString:?function() {
04????console.log('toString');
05????return?this.i;
06??},
07??valueOf:?function() {
08????console.log('valueOf');
09????return?this.i;
10??}
11}
12??
13alert(bbb);// 10 toString
14alert(+bbb);?// 10 valueOf
15alert(''+bbb);?// 10 valueOf
16alert(String(bbb));?// 10 toString
17alert(Number(bbb));?// 10? valueOf
18alert(bbb ==?'10');?// true valueOf
19alert(bbb ===?'10');?// false

乍一看結果,大抵給人的感覺是,如果轉換為字符串時調用toString方法,如果是轉換為數值時則調用valueOf方法,但其中有兩個很不和諧。一個是alert(''+bbb),字符串合拼應該是調用toString方法……另一個我們暫時可以理解為===操作符不進行隱式轉換,因此不調用它們。為了追究真相,我們需要更嚴謹的實驗。

01var?aa = {
02??i: 10,
03??toString:?function() {
04????console.log('toString');
05????return?this.i;
06??}
07}
08??
09alert(aa);// 10 toString
10alert(+aa);?// 10 toString
11alert(''+aa);?// 10 toString
12alert(String(aa));?// 10 toString
13alert(Number(aa));?// 10 toString
14alert(aa ==?'10');?// true toString

再看valueOf。

01var?bb = {
02???i: 10,
03???valueOf:?function() {
04?????console.log('valueOf');
05?????return?this.i;
06???}
07}
08??
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

發現有點不同吧?!它沒有像上面toString那樣統一規整。對于那個[object Object],我估計是從Object那里繼承過來的,我們再去掉它看看。

01Object.prototype.toString =?null;
02??
03var?cc = {
04??i: 10,
05??valueOf:?function() {
06????console.log('valueOf');
07????return?this.i;
08??}
09}
10??
11alert(cc);// 10 valueOf
12alert(+cc);?// 10 valueOf
13alert(''+cc);?// 10 valueOf
14alert(String(cc));?// 10 valueOf
15alert(Number(cc));?// 10 valueOf
16alert(cc ==?'10');?// true valueOf

如果只重寫了toString,對象轉換時會無視valueOf的存在來進行轉換。但是,如果只重寫了valueOf方法,在要轉換為字符串的時候會優先考慮valueOf方法。在不能調用toString的情況下,只能讓valueOf上陣了。對于那個奇怪的字符串拼接問題,可能是出于操作符上,翻開ECMA262-5 發現都有一個getValue操作。嗯,那么謎底應該是揭開了。重寫會加大它們調用的優化高,而在有操作符的情況下,valueOf的優先級本來就比toString的高。

轉載于:https://www.cnblogs.com/andhm/archive/2011/06/12/2078657.html

總結

以上是生活随笔為你收集整理的研究一下valueOf与toString方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。