javascript中強(qiáng)制執(zhí)行toString()具體實(shí)現(xiàn)
更新時間:2013年04月27日 14:43:35 作者:
Javascript通常會根據(jù)方法或運(yùn)算符的需要而自動把值轉(zhuǎn)成所需的類型,這可能導(dǎo)致各種錯誤,接下來為大家介紹下javascript如何強(qiáng)制執(zhí)行toString(),感興趣的朋友可以參考下哈
原文:Enforcing toString()
譯文:javascript 中強(qiáng)制執(zhí)行 toString()
譯者:singleseeker
Javascript通常會根據(jù)方法或運(yùn)算符的需要而自動把值轉(zhuǎn)成所需的類型,這可能導(dǎo)致各種錯誤。 Brian McKenna (@puffnfresh) suggests 提供了下列測試代碼:
Object.prototype.valueOf = function () {
throw new Error('Use an explicit toString');
};
[\s\S ]*\n
這些代碼會產(chǎn)生什么效果? 你現(xiàn)在再也不能用加號運(yùn)算符去把一個對像轉(zhuǎ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]'這個又是怎么回事呢? 要把一個對象轉(zhuǎn)成一個特定的基本類型 T,首先是它的值被轉(zhuǎn)化成基本類型,然后才是轉(zhuǎn)換成 T,前一個轉(zhuǎn)換由兩步完成:
1.調(diào)用 valueOf() 方法,如果返回一個基本類型,那么就結(jié)束
2.不然,調(diào)用方法 toString()。如果返回一個基本類型,那么結(jié)束
3.再不然,拋出錯誤
如果最后的轉(zhuǎn)換是個數(shù)值,會是上述調(diào)用 valueOf() 與 toString 的這個順序。
如果最后的轉(zhuǎn)換是字符串,那么 toString 會被先調(diào)用。 加號運(yùn)算符可能會被值轉(zhuǎn)成數(shù)值型或是字符串型,但它通常根據(jù)數(shù)字運(yùn)算產(chǎn)生一個基本類型。
不用在文章開始發(fā)的代碼片段, Object.prototype.valueOf() 會返回這個對象本身,這個是從原生對象繼續(xù)來的沒有被重寫的方法:
> var obj = {};
> obj.valueOf() === obj
true加號運(yùn)算符最終會調(diào)用 toString()。 上面的代碼片段阻止了調(diào)用,在能調(diào)用那個方法前拋出了錯誤。
注意這個錯誤信息并不總是完全正確。
> Number(obj)
Error: Use an explicit toString但是這一招扔然是有用的。
如果一個對象真想被轉(zhuǎn)化成數(shù)字,那么它無論如何還是要調(diào)用自己的 valueOf 方法。
@singleseeker羅嗦:這篇文章翻譯起來真心是想更種吐槽,知識點(diǎn)總結(jié)的倒是不錯, 不過做為一個不是英語為母語的老外寫的英文技術(shù)文章交給我一個母語不是英語的菜鳥翻譯,著實(shí)夠折磨人。 下面進(jìn)行簡單的總結(jié)。
1.通常 valuOf() 指示返回一個未轉(zhuǎn)換的對象,也就是其本身
2.加號運(yùn)算符除了 Date 對象外,幾乎全是先調(diào)用 valueof() 方法
3.如果使得 valueof() 返回一個明確的基本數(shù)值類型,那么當(dāng)一個對象與字符串相加時,toString() 將不會被調(diào)用
參考
1.強(qiáng)制轉(zhuǎn)換對象(objects)為原始值(primitives)
2.JavaScript中,{}+{}等于多少?
譯文:javascript 中強(qiáng)制執(zhí)行 toString()
譯者:singleseeker
Javascript通常會根據(jù)方法或運(yùn)算符的需要而自動把值轉(zhuǎn)成所需的類型,這可能導(dǎo)致各種錯誤。 Brian McKenna (@puffnfresh) suggests 提供了下列測試代碼:
復(fù)制代碼 代碼如下:
Object.prototype.valueOf = function () {
throw new Error('Use an explicit toString');
};
[\s\S ]*\n
這些代碼會產(chǎn)生什么效果? 你現(xiàn)在再也不能用加號運(yùn)算符去把一個對像轉(zhuǎn)成一個字符串了:
[code]
> var obj = {};
> 'Hello '+obj
Error: Use an explicit toString
復(fù)制代碼 代碼如下:
> String(obj)
'[object Object]'
> obj.toString()
'[object Object]'
> 'Hello '+String(obj)
'Hello [object Object]'這個又是怎么回事呢? 要把一個對象轉(zhuǎn)成一個特定的基本類型 T,首先是它的值被轉(zhuǎn)化成基本類型,然后才是轉(zhuǎn)換成 T,前一個轉(zhuǎn)換由兩步完成:
1.調(diào)用 valueOf() 方法,如果返回一個基本類型,那么就結(jié)束
2.不然,調(diào)用方法 toString()。如果返回一個基本類型,那么結(jié)束
3.再不然,拋出錯誤
如果最后的轉(zhuǎn)換是個數(shù)值,會是上述調(diào)用 valueOf() 與 toString 的這個順序。
如果最后的轉(zhuǎn)換是字符串,那么 toString 會被先調(diào)用。 加號運(yùn)算符可能會被值轉(zhuǎn)成數(shù)值型或是字符串型,但它通常根據(jù)數(shù)字運(yùn)算產(chǎn)生一個基本類型。
不用在文章開始發(fā)的代碼片段, Object.prototype.valueOf() 會返回這個對象本身,這個是從原生對象繼續(xù)來的沒有被重寫的方法:
復(fù)制代碼 代碼如下:
> var obj = {};
> obj.valueOf() === obj
true加號運(yùn)算符最終會調(diào)用 toString()。 上面的代碼片段阻止了調(diào)用,在能調(diào)用那個方法前拋出了錯誤。
注意這個錯誤信息并不總是完全正確。
復(fù)制代碼 代碼如下:
> Number(obj)
Error: Use an explicit toString但是這一招扔然是有用的。
如果一個對象真想被轉(zhuǎn)化成數(shù)字,那么它無論如何還是要調(diào)用自己的 valueOf 方法。
@singleseeker羅嗦:這篇文章翻譯起來真心是想更種吐槽,知識點(diǎn)總結(jié)的倒是不錯, 不過做為一個不是英語為母語的老外寫的英文技術(shù)文章交給我一個母語不是英語的菜鳥翻譯,著實(shí)夠折磨人。 下面進(jìn)行簡單的總結(jié)。
1.通常 valuOf() 指示返回一個未轉(zhuǎn)換的對象,也就是其本身
2.加號運(yùn)算符除了 Date 對象外,幾乎全是先調(diào)用 valueof() 方法
3.如果使得 valueof() 返回一個明確的基本數(shù)值類型,那么當(dāng)一個對象與字符串相加時,toString() 將不會被調(diào)用
參考
1.強(qiáng)制轉(zhuǎn)換對象(objects)為原始值(primitives)
2.JavaScript中,{}+{}等于多少?
相關(guān)文章
vscode工具函數(shù)idGenerator使用深度解析
這篇文章主要為大家介紹了vscode工具函數(shù)idGenerator使用深度解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03uniapp獲取手機(jī)通知權(quán)限實(shí)現(xiàn)demo
這篇文章主要為大家介紹了uniapp獲取手機(jī)通知權(quán)限實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07JavaScript實(shí)現(xiàn)聯(lián)動菜單特效
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)聯(lián)動菜單特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-01-01解析javascript 數(shù)組以及json元素的添加刪除
本篇文章是對javascript 數(shù)組以及json元素的添加刪除進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06