首頁 > web前端 > js教程 > 主體

Javascript中valueOf與toString區別淺析_javascript技巧

WBOY
發布: 2016-05-16 17:40:03
原創
848 人瀏覽過

前言

基本上,所有JS資料型別都擁有這兩種方法,null除外。它們兩個解決javascript值運算與顯示的問題,重寫會增加它們所呼叫的最佳化。

檢定分析

先看一個例子:

複製程式碼 程式碼如下:
 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中實驗!



複製程式碼 程式碼如下:var bbb = {
 🎜> toString: function() {
  console.log('toString');
  return this.i;
 },
 valueOf: function() {
  cons> valueOf: function() {
valueOf');
  return this.i;
 }
}

alert(bbb);// 10 toString
alert( bbb); // 10 valueOfalert('' 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方法…另一個我們暫時可以理解為===運算子不進行隱式轉換,因此不呼叫它們。為了追究真相,我們需要更嚴謹的實驗。



複製程式碼 程式碼如下:var aa = {
 i:10,  toString: function() {
  console.log('toString');
  return this.i;
 }
}
alert(aa)/// 10 toString
}
alert(aa);// 100 to >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


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




複製程式碼 程式碼如下:Object.prototype.toString = null]; 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


總結:valueOf偏向運算,toString偏向顯示。
1、 在進行物件轉換時(例如:alert(a)),將優先呼叫toString方法,如若沒有重寫toString將呼叫valueOf方法,如果兩個方法都不沒有重寫,但按Object的toString輸出。
2、 進行強轉字串型別時將優先呼叫toString方法,強轉為數字時優先呼叫valueOf。
3、 在有運算運算元的情況下,valueOf的優先權高於toString。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板