在数字文字上调用 toFixed 方法

Calling the toFixed method on a number literal

当我像这样对十进制数字文字调用 toFixed() 方法时:

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

结果有效 returns 67.68

但是,如果我对整数调用该方法 - 我会收到错误消息

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

为什么会这样?

注意:

如果我将整数保存到变量中 - toFixed() 方法会起作用。

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

this jsBin

幕后发生了什么?

var b = 67.toFixed(2); 简单地生成一个解析错误,因为解析器无法推断出你的意思是它是一个数字文字后跟一个 属性 访问器(注意错误在第一行, 不在 console.log(b))

这对 67.678.toFixed(2) 有效的原因是没有其他选择。解析器可以毫不含糊地推断出数字文字以“8”数字结尾,并且可以继续将下一个点解析为 属性 访问器(这导致首先装箱到 Number 对象中)。

一个解决方案显然很简单:

(67).toFixed(2);

好吧,这是一个与语言相关的语法问题。当你写 xx. 时,如果 xx 是数字,它假定下一个出现在 . 运算符之后的是另一个数字。但是如果你把它括在括号里,比如 (xx).toFixed(2) 它就可以了。后面发生的事情是在括号分隔解析之后或在写入完整的十进制文字时创建一个对象,并在该对象上调用 toFixed

希望它能回答我们的问题.. :)

您的选择包括:

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

所有这些都避免了JS解析器将数字后面的点视为小数点的问题。