[英]Does String(number) call number.toString internally?
我只是嘗試嘗試一下,發現了這一點:
如果您在自定義toString
調用String(n)
,它會自我調用並拋出錯誤, Maximum Call Stack exceeded
,
Number.prototype.toString = function() { return String(this) } var a = 10; try { a.toString() } catch (err) { console.log(err.message) }
但是,如果直接調用var b = String(a)
,則不會調用toString
函數。
Number.prototype.toString = function(){ console.log(this); return '' + this; } var a = 10; a.toString();
注意:我知道上面的代碼段也chrome - JSFiddle
相同的錯誤,但是我已經檢查了Node
, chrome - JSFiddle
和Firefox - JSFiddle
並且它是一致的。 var b = String(a)
不調用number.toString()
,所以'' + this
。 這是Stack片段中的一些優化,即在''+this
上調用number.toString()
。
所以我的問題是,我想念什么? 為什么會有這種奇怪的行為?
實際數字調用內部方法將其轉換為字符串,並且除非明確調用它們,否則它們的輸出不受valueOf
和toString
影響。
那么為什么首先要調用toString
?
這是因為在“草率”(非嚴格)模式,的值this
將被轉化成它的對象形式(即相當於new Number(10)
被傳遞到前) String(this)
或'' + this
。
(因此,在使用嚴格模式的普通應用程序中,您可能看不到這兩種方式之間的差異。)
由於this
是一個對象,因此String()
和+
加法運算符都將嘗試將該對象轉換為字符串。 通常通過調用obj.toString
或obj.valueOf
來完成此操作。
至於為什么String(this)
失敗但'' + this
失敗,那么String
函數在調用valueOf
之前先在對象上調用toString
。
但是,當您使用加法( +
)運算符時, valueOf
和toString
的順序相反。
可能是您應該使用通話/應用。
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) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.