原文:Enforcing toString()
譯文:javascript 強制執行toString()
譯者:singleseeker
譯者:singleseeker Java方法或運算子的需要而自動把值轉成所需的類型,這可能導致各種錯誤。 Brian McKenna (@puffnfresh
)
程式碼如下:
Object.prototype.valueOf = function () {
throw new Error('Use an explicit toString');
};
[sS ]* n
這些程式碼會產生什麼效果? 你現在再也不能用加號運算子去把一個物件轉成一個字串了:
[code]
> var obj = {};
> 'Hello ' obj
Error: Use an explicit toString 複製程式碼
程式碼String(obj)
'[object Object]'
> obj.toString()
'[object Object]'
> 'Hello ' String(obj)
'Hello [object Object]'這個又是怎麼回事? 要把一個物件轉成一個特定的基本型別T,首先是它的值被轉換成基本型,然後才是轉換成T,前一個轉換由
兩步完成:
1.呼叫valueOf() 方法,如果傳回一個基本型,那麼就結束
2.不然,呼叫方法toString()。如果回傳一個基本型別,那麼結束
3.再不然,拋出錯誤
如果最後的轉換是個數值,會是上述呼叫 valueOf() 與 toString 的這個順序。
如果最後的轉換是字串,那麼 toString 會先呼叫。 加號運算子可能會被值轉成數值型或是字串型,但它
通常根據數字運算產生一個基本型別。
不用在文章開始發的程式碼片段, Object.prototype.valueOf() 會回傳這個物件本身,這個是從原生物件繼續來的沒有被重寫的方法:
> var obj = {};
> obj.valueOf() === obj
true加號運算子最終會呼叫toString()。 上面的程式碼片段阻止了調用,在能調用那個方法之前拋出了錯誤。
注意這個錯誤訊息並不總是完全正確。
> Number(obj)
> Number(obj)
> Number(obj) > Number(obj)
> Number(obj)
Error: Use an explicit toString但這一招丟然是有用的。
如果一個物件真想被轉換成數字,那麼它無論如何還是要呼叫自己的 valueOf 方法。
@singleseeker囉嗦:這篇文章翻譯起來真心是想更種吐槽,知識點總結的倒是不錯, 不過做為一個不是英語為母語的老外寫的英文技術文章交給我一個母語不是英文的菜鳥翻譯,著實夠折磨人。 下面進行簡單的總結。 1.通常valuOf() 指示返回一個未轉換的對象,也就是其本身2.加號運算子除了Date 物件外,幾乎全是先呼叫valueof() 方法3.如果使得valueof() 傳回一個明確的基本數值類型,那麼當一個物件與字串相加時,toString() 將不會被呼叫參考1.強制轉換物件(objects)為原始值(primitives) 2.JavaScript中,{} {}等於多少?