2016-11-28 22 views
2

我只是想的東西,發現這個:String(number)在內部調用number.toString嗎?

如果你打電話String(n)內定製toString,它調用本身並引發錯誤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();

注:我知道上面的代碼中也拋出同樣的錯誤,但我已經Nodechrome - JSFiddleFirefox - JSFiddle檢查,這是一致的。 var b = String(a)不叫number.toString()'' + this也不叫。這是在棧片段中的一些優化,其在''+this上調用number.toString()

所以我的問題是,我錯過了什麼?爲什麼這種奇怪的行爲?

+0

@Downvoters,我尊重你的觀點,但如果你認爲,什麼是錯的帖子,請分享您的評論。只是投票下來不會幫助任何人。 – Rajesh

回答

2

實際編號調用內部方法將其轉換爲字符串,其輸出不受valueOftoString的影響,除非它們被明確調用。

那麼爲什麼toString然後在第一個地方叫?

這是因爲在「草率」(非嚴格)模式下,this值將被傳遞到或String(this)之前'' + this轉化成它的對象的形式(即new Number(10)當量)。

(出於這個原因,你可能無法看到正常的應用這兩種方式在使用嚴格模式之間的區別。)

由於this是一個對象,無論String()+加法運算符將嘗試轉換將該對象轉換爲字符串。這通常通過撥打obj.toStringobj.valueOf來完成。

至於爲什麼String(this)失敗,但'' + this沒有,String函數調用valueOf之前調用該對象的toString

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

+0

不確定「*這個值將被轉換爲它的對象形式... *。我認爲它是第二部分,'String(value)'將調用'value.toString',所以如果它的* toString *方法比調用* String *,發生遞歸,參見[* ECMA-262§21.1.1.1*](http://ecma-international.org/ecma-262/7.0/index.html#sec-string-constructor-string- value) – RobG

+0

@RobG:我的意思是'toString'首先被調用的原因是數字的對象形式爲'String()',我會試着澄清我說過的話 –

+0

Cool實際上,閱讀更加緊密,ECMA-262沒有在[*算法中爲ToString(number)*]指定調用toString(http://ecma-international.org/ecma-262/7.0/index.html#sec -tostring-applied-the-number-type),它可能就是它的實現方式 – RobG

0

可能你應該使用call/apply。

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) 
 
}

的原因,我認爲是The reason to use JS .call() method?

+0

嘿,問題的目標是理解爲什麼會發生這種情況。同樣只是一個指針,在沒有'this'的情況下執行'.call'會清除上下文。 – Rajesh

相關問題