2015-10-14 52 views
2

當我請一個十進制數的toFixed()方法的文字像這樣:調用多項字面的toFixed方法

var a = 67.678.toFixed(2); 
console.log(a); 

結果的作品,並返回67.68

但是如果我調用該方法在一個整數 - 我得到一個錯誤

var b = 67.toFixed(2); 
console.log(b); // causes ERROR 

爲什麼會出現這種情況?

NB:

如果我的整數保存到變量 - 的toFixed()方法確實工作。

var c = 67; 
c = c.toFixed(2); 
console.log(c); // returns 67.00 

this jsBin

什麼是引擎蓋下回事?

+1

你試過了嗎?(67).toFixed(2)'? – Arvind

+3

以及它的語言相關的語法問題。當你編寫'xx.'時,如果'xx'是數字,它假定'.'運算符是另一個數字後出現的下一個東西。但如果你把它放在''(xx).toFixed(2)''這樣的函數中就行了。 – Minato

+0

那麼爲什麼十進制數不需要括號呢? – Danield

回答

5

var b = 67.toFixed(2);只需生成分析錯誤作爲分析器無法推斷出你的意思它是一個數字面後跟一個屬性訪問(請注意,該誤差是在第一行上,而不是在console.log(b)

這個原因適用於67.678.toFixed(2)的原因是沒有其他選擇。解析器可以毫不含糊地推論出數字文字在「8」位結束,並且可以繼續解析下一個點作爲屬性訪問器(這會導致首先裝入對象Number)。

一種解決方案是明顯簡單:

(67).toFixed(2); 
1

以及其語言相關的語法問題。當您編寫xx.如果xx是數字,它假定在.運算符是另一個數字後出現的下一件事。但是如果你把它括在括號裏,就像(xx).toFixed(2)那樣。在後面發生的事情是在括號界定分析之後或寫入完整十進制文字時創建對象並在該對象上調用toFixed

希望這回答了我們的問題.. :)

+1

不,括號不會「創建目的」。爲了解析目的,它們爲該號碼分隔。 – 2015-10-14 07:45:58

+0

雖然它可能是一種可能性,但我猜對象被創建。鏈接'toFixed'方法調用。因爲方法的定義可能不在JS語言的語法或語義規則中 – Minato

+0

是的,創建一個瞬態對象以調用'toFixed'。但是,無論如何都會創建這樣的對象,包括'67.0.toFixed()'。你說圓括號創建對象。這是不正確的。 – 2015-10-14 07:50:29

2

選項包括:

67 .toFixed(2) 
(67).toFixed(2) 
67..toFixed(2) 
67.0.toFixed(2) 
67["toFixed"](2) 

所有這些避免了JS分析器把一個點立即號小數點後的問題。

+0

不要忘記'Number.prototype.toFixed.call(67,2)'和朋友(綁定,應用..) – Amit