前言
基本上,所有JS資料型別都擁有這兩種方法,null除外。它們兩個解決javascript值運算與顯示的問題,重寫會增加它們所呼叫的最佳化。
檢定分析
先看一個例子:
之所以有這樣的結果,因為它們偷偷地呼叫valueOf或toString方法。
但如何區分什麼情況下是呼叫了哪個方法呢,我們可以用另一個方法測試一下。
alert(String(bbb)); / / 10 toString
alert(Number(bbb)); // 10 valueOf
alert(bbb == '10'); // true valueOf
alert(bbb === '10'); / / false
結果給人的感覺是,如果轉換為字串時呼叫toString方法,如果是轉換為數值時則呼叫valueOf方法,但其中有兩個很不和諧。一個是alert('' bbb),字串合拼應該是呼叫toString方法…另一個我們暫時可以理解為===運算子不進行隱式轉換,因此不呼叫它們。為了追究真相,我們需要更嚴謹的實驗。
alert(String(bb)) ; // [object Object]
alert(Number(bb)); // 10 valueOf
alert(bb == '10'); // true valueOf
發現有點不同吧? !它沒有像上面toString那樣統一規整。
對於那個[object Object],我估計是從Object那裡繼承過來的,我們再去掉它看看。
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。