轉載一篇關於toString和valueOf

能夠這樣說,全部JS數據類型都擁有valueOf和toString這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題。在程序應用很是普遍。下面咱們逐一來給你們介紹下。javascript

JavaScript 的 valueOf() 方法java

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

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

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

以上腳本會輸出false。this

JavaScript 的 toString() 方法spa

toString() 方法可把一個邏輯值轉換爲字符串,並返回結果。.net

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

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

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

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

腳本輸出:true。

先看一例:

?
1
2
3
4
5
6
7
8
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中實驗!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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方法……另外一個咱們暫時能夠理解爲===操做符不進行隱式轉換,所以不調用它們。爲了追究真相,咱們須要更嚴謹的實驗。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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那裏繼承過來的,咱們再去掉它看看。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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,對象轉換時會無視valueOf的存在來進行轉換。可是,若是隻重寫了valueOf方法,在要轉換爲字符串的時候會優先考慮valueOf方法。在不能調用toString的狀況下,只能讓valueOf上陣了。對於那個奇怪的字符串拼接問題,多是出於操做符上,翻開ECMA262-5 發現都有一個getValue操做。嗯,那麼謎底應該是揭開了。重寫會加大它們調用的優化高,而在有操做符的狀況下,valueOf的優先級原本就比toString的高。能夠這樣說,全部JS數據類型都擁有valueOf和toString這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題。在程序應用很是普遍。下面咱們逐一來給你們介紹下。

JavaScript 的 valueOf() 方法

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

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

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

以上腳本會輸出false。

JavaScript 的 toString() 方法

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

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

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

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

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

腳本輸出:true。

先看一例:

?
1
2
3
4
5
6
7
8
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中實驗!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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方法……另外一個咱們暫時能夠理解爲===操做符不進行隱式轉換,所以不調用它們。爲了追究真相,咱們須要更嚴謹的實驗。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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那裏繼承過來的,咱們再去掉它看看。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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,對象轉換時會無視valueOf的存在來進行轉換。可是,若是隻重寫了valueOf方法,在要轉換爲字符串的時候會優先考慮valueOf方法。在不能調用toString的狀況下,只能讓valueOf上陣了。對於那個奇怪的字符串拼接問題,多是出於操做符上,翻開ECMA262-5 發現都有一個getValue操做。嗯,那麼謎底應該是揭開了。重寫會加大它們調用的優化高,而在有操做符的狀況下,valueOf的優先級原本就比toString的高。

能夠這樣說,全部JS數據類型都擁有valueOf和toString這兩個方法,null除外。它們倆解決javascript值運算與顯示的問題。在程序應用很是普遍。下面咱們逐一來給你們介紹下。

JavaScript 的 valueOf() 方法

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

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

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

以上腳本會輸出false。

JavaScript 的 toString() 方法

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

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

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

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

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

腳本輸出:true。

先看一例:

?
1
2
3
4
5
6
7
8
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中實驗!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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方法……另外一個咱們暫時能夠理解爲===操做符不進行隱式轉換,所以不調用它們。爲了追究真相,咱們須要更嚴謹的實驗。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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那裏繼承過來的,咱們再去掉它看看。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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,對象轉換時會無視valueOf的存在來進行轉換。可是,若是隻重寫了valueOf方法,在要轉換爲字符串的時候會優先考慮valueOf方法。在不能調用toString的狀況下,只能讓valueOf上陣了。對於那個奇怪的字符串拼接問題,多是出於操做符上,翻開ECMA262-5 發現都有一個getValue操做。嗯,那麼謎底應該是揭開了。重寫會加大它們調用的優化高,而在有操做符的狀況下,valueOf的優先級原本就比toString的高。

相關文章
相關標籤/搜索