簡體   English   中英

String(number)是否在內部調用number.toString?

[英]Does String(number) call number.toString internally?

我只是嘗試嘗試一下,發現了這一點:

如果您在自定義toString調用String(n) ,它會自我調用並拋出錯誤, Maximum Call Stack exceeded

的jsfiddle

 Number.prototype.toString = function() { return String(this) } var a = 10; try { a.toString() } catch (err) { console.log(err.message) } 

但是,如果直接調用var b = String(a) ,則不會調用toString函數。

的jsfiddle

 Number.prototype.toString = function(){ console.log(this); return '' + this; } var a = 10; a.toString(); 

注意:我知道上面的代碼段也chrome - JSFiddle相同的錯誤,但是我已經檢查了Nodechrome - JSFiddleFirefox - JSFiddle並且它是一致的。 var b = String(a)不調用number.toString() ,所以'' + this 這是Stack片段中的一些優化,即在''+this上調用number.toString()

所以我的問題是,我想念什么? 為什么會有這種奇怪的行為?

實際數字調用內部方法將其轉換為字符串,並且除非明確調用它們,否則它們的輸出不受valueOftoString影響。

那么為什么首先要調用toString

這是因為在“草率”(非嚴格)模式,的值this將被轉化成它的對象形式(即相當於new Number(10)被傳遞到前) String(this)'' + this

(因此,在使用嚴格模式的普通應用程序中,您可能看不到這兩種方式之間的差異。)

由於this是一個對象,因此String()+加法運算符都將嘗試將該對象轉換為字符串。 通常通過調用obj.toStringobj.valueOf來完成此操作。

至於為什么String(this)失敗但'' + this失敗,那么String函數在調用valueOf之前先在對象上調用toString

但是,當您使用加法( + )運算符時, valueOftoString的順序相反。

可能是您應該使用通話/應用。

 Number.prototype.toString = function() { console.log(this) return String(this) } var a = 10; try { a.toString.call() console.log(a) } catch (err) { console.log(err.message) } 

我認為是使用JS .call()方法的原因嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM