javascript中強制執行toString()具體實現

來源:互聯網
上載者:User

原文:Enforcing toString()
譯文:javascript 中強制執行 toString()
譯者:singleseeker
Javascript通常會根據方法或運算子的需要而自動把值轉成所需的類型,這可能導致各種錯誤。 Brian McKenna (@puffnfresh) suggests 提供了下列測試代碼: 複製代碼 代碼如下:Object.prototype.valueOf = function () {
throw new Error('Use an explicit toString');
};
[\s\S ]*\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)

Error: Use an explicit toString但是這一招扔然是有用的。
如果一個對象真想被轉化成數字,那麼它無論如何還是要調用自己的 valueOf 方法。
@singleseeker羅嗦:這篇文章翻譯起來真心是想更種吐槽,知識點總結的倒是不錯, 不過做為一個不是英語為母語的老外寫的英文技術文章交給我一個母語不是英語的菜鳥翻譯,著實夠折磨人。 下面進行簡單的總結。
1.通常 valuOf() 指示返回一個未轉換的對象,也就是其本身
2.加號運算子除了 Date 對象外,幾乎全是先調用 valueof() 方法
3.如果使得 valueof() 返回一個明確的基本數實值型別,那麼當一個對象與字串相加時,toString() 將不會被調用
參考
1.強制轉換對象(objects)為原始值(primitives)
2.JavaScript中,{}+{}等於多少?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.