Fe-interview: [js] 第35天 请你解释一个为什么10.toFixed(10)会报错?

Created on 20 May 2019  ·  7Comments  ·  Source: haizlin/fe-interview

第35天 请你解释一个为什么10.toFixed(10)会报错?

js

Most helpful comment

哦~~,原来是这样啊
之所以会报错,是因为在这里的 . 发生了歧义,它既可以理解为小数点,也可以理解为对方法的调用。
因为这个点紧跟于一个数字之后,按照规范,解释器就把它判断为一个小数点。

所以我们可以这样修改下:

(10).toFixed(10)
10..toFixed(10)
10 .toFixed(10)
10.0.toFixed(10)

当然出现这个报错是因为前面这个数是整数,如果本来就是小数就不会出现这个报错。

All 7 comments

哦~~,原来是这样啊
之所以会报错,是因为在这里的 . 发生了歧义,它既可以理解为小数点,也可以理解为对方法的调用。
因为这个点紧跟于一个数字之后,按照规范,解释器就把它判断为一个小数点。

所以我们可以这样修改下:

(10).toFixed(10)
10..toFixed(10)
10 .toFixed(10)
10.0.toFixed(10)

当然出现这个报错是因为前面这个数是整数,如果本来就是小数就不会出现这个报错。

10.toFixed(10) // Uncaught SyntaxError: Invalid or unexpected token
(10).toFixed(10)  // "10.0000000000"

原因是js解释器对.的解释发生了歧义导致。

. 当成float了

在我们的直觉上,10.toFixed(10) 是把整数的 10 转为浮点数并且保留 10 位小数部分。

但实际上会出错,是因为 JS 的解释器对 . 操作符产生了歧义。在 JS 中 . 可以表示小数和从对象中取值。在这个例子中, 由于 10 是整数,所以在 10. 默认是小数点,因此会报错。

解决的办法有下面几种:

  • (10).toFixed(10) 个人喜欢这种,看起来舒服一点
  • 10..toFixed(10)

参考文章:
Javascript 的语法歧义之点“.”

歧义之前没有注意到,会使用()包裹的形式并认为是进行了隐形转换或者说是定义运算优先级,歧义的说法更合适。而且不使用括号也会发生原生值10Number对象10的隐性转换,之前的想法不严谨

原因是 toFixed前面跟一个整数时,他会把10.toFixed()这个“.”误解为小数点
所以解决方法可以把10用变量保存起来
楼上大佬的方法也可以
10..toFixed(10)
10 .toFixed(10)
(10).toFixed(10)
10.0.toFixed(10)

```js
10.toFixed(10) // Uncaught SyntaxError: Invalid or unexpected token
(10).toFixed(10)  // "10.0000000000"

原因是js解释器对.的解释发生了歧义导致。
```

Was this page helpful?
0 / 5 - 0 ratings