javascript中強(qiáng)制執(zhí)行toString()具體實(shí)現(xiàn)
更新時(shí)間:2013年04月27日 14:43:35 作者:
Javascript通常會(huì)根據(jù)方法或運(yùn)算符的需要而自動(dòng)把值轉(zhuǎn)成所需的類型,這可能導(dǎo)致各種錯(cuò)誤,接下來為大家介紹下javascript如何強(qiáng)制執(zhí)行toString(),感興趣的朋友可以參考下哈
原文:Enforcing toString()
譯文:javascript 中強(qiáng)制執(zhí)行 toString()
譯者:singleseeker
Javascript通常會(huì)根據(jù)方法或運(yùn)算符的需要而自動(dòng)把值轉(zhuǎn)成所需的類型,這可能導(dǎo)致各種錯(cuò)誤。 Brian McKenna (@puffnfresh) suggests 提供了下列測(cè)試代碼:
Object.prototype.valueOf = function () {
throw new Error('Use an explicit toString');
};
[\s\S ]*\n
這些代碼會(huì)產(chǎn)生什么效果? 你現(xiàn)在再也不能用加號(hào)運(yùn)算符去把一個(gè)對(duì)像轉(zhuǎn)成一個(gè)字符串了:
[code]
> var obj = {};
> 'Hello '+obj
Error: Use an explicit toString
> String(obj)
'[object Object]'
> obj.toString()
'[object Object]'
> 'Hello '+String(obj)
'Hello [object Object]'這個(gè)又是怎么回事呢? 要把一個(gè)對(duì)象轉(zhuǎn)成一個(gè)特定的基本類型 T,首先是它的值被轉(zhuǎn)化成基本類型,然后才是轉(zhuǎn)換成 T,前一個(gè)轉(zhuǎn)換由兩步完成:
1.調(diào)用 valueOf() 方法,如果返回一個(gè)基本類型,那么就結(jié)束
2.不然,調(diào)用方法 toString()。如果返回一個(gè)基本類型,那么結(jié)束
3.再不然,拋出錯(cuò)誤
如果最后的轉(zhuǎn)換是個(gè)數(shù)值,會(huì)是上述調(diào)用 valueOf() 與 toString 的這個(gè)順序。
如果最后的轉(zhuǎn)換是字符串,那么 toString 會(huì)被先調(diào)用。 加號(hào)運(yùn)算符可能會(huì)被值轉(zhuǎn)成數(shù)值型或是字符串型,但它通常根據(jù)數(shù)字運(yùn)算產(chǎn)生一個(gè)基本類型。
不用在文章開始發(fā)的代碼片段, Object.prototype.valueOf() 會(huì)返回這個(gè)對(duì)象本身,這個(gè)是從原生對(duì)象繼續(xù)來的沒有被重寫的方法:
> var obj = {};
> obj.valueOf() === obj
true加號(hào)運(yùn)算符最終會(huì)調(diào)用 toString()。 上面的代碼片段阻止了調(diào)用,在能調(diào)用那個(gè)方法前拋出了錯(cuò)誤。
注意這個(gè)錯(cuò)誤信息并不總是完全正確。
> Number(obj)
Error: Use an explicit toString但是這一招扔然是有用的。
如果一個(gè)對(duì)象真想被轉(zhuǎn)化成數(shù)字,那么它無論如何還是要調(diào)用自己的 valueOf 方法。
@singleseeker羅嗦:這篇文章翻譯起來真心是想更種吐槽,知識(shí)點(diǎn)總結(jié)的倒是不錯(cuò), 不過做為一個(gè)不是英語為母語的老外寫的英文技術(shù)文章交給我一個(gè)母語不是英語的菜鳥翻譯,著實(shí)夠折磨人。 下面進(jìn)行簡(jiǎn)單的總結(jié)。
1.通常 valuOf() 指示返回一個(gè)未轉(zhuǎn)換的對(duì)象,也就是其本身
2.加號(hào)運(yùn)算符除了 Date 對(duì)象外,幾乎全是先調(diào)用 valueof() 方法
3.如果使得 valueof() 返回一個(gè)明確的基本數(shù)值類型,那么當(dāng)一個(gè)對(duì)象與字符串相加時(shí),toString() 將不會(huì)被調(diào)用
參考
1.強(qiáng)制轉(zhuǎn)換對(duì)象(objects)為原始值(primitives)
2.JavaScript中,{}+{}等于多少?
譯文:javascript 中強(qiáng)制執(zhí)行 toString()
譯者:singleseeker
Javascript通常會(huì)根據(jù)方法或運(yùn)算符的需要而自動(dòng)把值轉(zhuǎn)成所需的類型,這可能導(dǎo)致各種錯(cuò)誤。 Brian McKenna (@puffnfresh) suggests 提供了下列測(cè)試代碼:
復(fù)制代碼 代碼如下:
Object.prototype.valueOf = function () {
throw new Error('Use an explicit toString');
};
[\s\S ]*\n
這些代碼會(huì)產(chǎn)生什么效果? 你現(xiàn)在再也不能用加號(hào)運(yùn)算符去把一個(gè)對(duì)像轉(zhuǎn)成一個(gè)字符串了:
[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]'這個(gè)又是怎么回事呢? 要把一個(gè)對(duì)象轉(zhuǎn)成一個(gè)特定的基本類型 T,首先是它的值被轉(zhuǎn)化成基本類型,然后才是轉(zhuǎn)換成 T,前一個(gè)轉(zhuǎn)換由兩步完成:
1.調(diào)用 valueOf() 方法,如果返回一個(gè)基本類型,那么就結(jié)束
2.不然,調(diào)用方法 toString()。如果返回一個(gè)基本類型,那么結(jié)束
3.再不然,拋出錯(cuò)誤
如果最后的轉(zhuǎn)換是個(gè)數(shù)值,會(huì)是上述調(diào)用 valueOf() 與 toString 的這個(gè)順序。
如果最后的轉(zhuǎn)換是字符串,那么 toString 會(huì)被先調(diào)用。 加號(hào)運(yùn)算符可能會(huì)被值轉(zhuǎn)成數(shù)值型或是字符串型,但它通常根據(jù)數(shù)字運(yùn)算產(chǎn)生一個(gè)基本類型。
不用在文章開始發(fā)的代碼片段, Object.prototype.valueOf() 會(huì)返回這個(gè)對(duì)象本身,這個(gè)是從原生對(duì)象繼續(xù)來的沒有被重寫的方法:
復(fù)制代碼 代碼如下:
> var obj = {};
> obj.valueOf() === obj
true加號(hào)運(yùn)算符最終會(huì)調(diào)用 toString()。 上面的代碼片段阻止了調(diào)用,在能調(diào)用那個(gè)方法前拋出了錯(cuò)誤。
注意這個(gè)錯(cuò)誤信息并不總是完全正確。
復(fù)制代碼 代碼如下:
> Number(obj)
Error: Use an explicit toString但是這一招扔然是有用的。
如果一個(gè)對(duì)象真想被轉(zhuǎn)化成數(shù)字,那么它無論如何還是要調(diào)用自己的 valueOf 方法。
@singleseeker羅嗦:這篇文章翻譯起來真心是想更種吐槽,知識(shí)點(diǎn)總結(jié)的倒是不錯(cuò), 不過做為一個(gè)不是英語為母語的老外寫的英文技術(shù)文章交給我一個(gè)母語不是英語的菜鳥翻譯,著實(shí)夠折磨人。 下面進(jìn)行簡(jiǎn)單的總結(jié)。
1.通常 valuOf() 指示返回一個(gè)未轉(zhuǎn)換的對(duì)象,也就是其本身
2.加號(hào)運(yùn)算符除了 Date 對(duì)象外,幾乎全是先調(diào)用 valueof() 方法
3.如果使得 valueof() 返回一個(gè)明確的基本數(shù)值類型,那么當(dāng)一個(gè)對(duì)象與字符串相加時(shí),toString() 將不會(huì)被調(diào)用
參考
1.強(qiáng)制轉(zhuǎn)換對(duì)象(objects)為原始值(primitives)
2.JavaScript中,{}+{}等于多少?
相關(guān)文章
javascript中負(fù)數(shù)算術(shù)右移、邏輯右移的奧秘探索
javascript中負(fù)數(shù)的算術(shù)右移和邏輯右移都十分的讓人迷惑,特別是邏輯右移,接下來的文章中將為大家詳細(xì)介紹下為什么右移之后,一個(gè)很小的負(fù)數(shù)也會(huì)得到一個(gè)無比巨大的數(shù)2013-10-10
微信小程序獲取手機(jī)網(wǎng)絡(luò)狀態(tài)的方法【附源碼下載】
這篇文章主要介紹了微信小程序獲取手機(jī)網(wǎng)絡(luò)狀態(tài)的方法,涉及微信小程序wx.getNetworkType函數(shù)檢查網(wǎng)絡(luò)連接狀態(tài)的相關(guān)使用技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2017-12-12
javascript正則表達(dá)式中參數(shù)g(全局)的作用
表達(dá)式加上參數(shù)g之后,表明可以進(jìn)行全局匹配,注意這里可以的含義。2010-11-11
使用 bootstrap modal遇到的問題小結(jié)
bootstrap提供了一個(gè)寫好的css文件和js文件然而在使用時(shí)遇到了一下并不是很好的問題,今天在使用彈出對(duì)話框時(shí)遇到了一個(gè)這樣的問題,今天小編給大家分享下使用 bootstrap modal遇到的問題小結(jié),一起看看吧2016-11-11
bootstrap table實(shí)現(xiàn)點(diǎn)擊翻頁功能 可記錄上下頁選中的行
這篇文章主要介紹了bootstrap table實(shí)現(xiàn)點(diǎn)擊翻頁功能,可記錄上下頁選中的行,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
使用JavaScript將PDF頁面中的標(biāo)注扁平化的操作指南
扁平化(flatten)操作可以將標(biāo)注作為矢量圖形包含在PDF頁面的內(nèi)容中,使其不可編輯,Dynamsoft Document Viewer是一個(gè)用于文檔掃描和查看的JavaScript SDK,可以添加標(biāo)注、導(dǎo)出PDF,在本文中,我們將探討如何使用它,需要的朋友可以參考下2025-01-01
JS實(shí)現(xiàn)靜態(tài)頁面搜索并高亮顯示功能完整示例
這篇文章主要介紹了JS實(shí)現(xiàn)靜態(tài)頁面搜索并高亮顯示功能,涉及javascript事件響應(yīng)、字符遍歷替換及頁面元素屬性動(dòng)態(tài)變換等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
javascript網(wǎng)頁隨機(jī)點(diǎn)名實(shí)現(xiàn)過程解析
這篇文章主要介紹了javascript實(shí)現(xiàn)網(wǎng)頁隨機(jī)變色及實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10

