JS014. 点常量 & 点运算符 同时出现时的优先级
在控制台调试toFixed()丢失精度的问题时,踩了一个意料之外情理之中的小坑。
点常量 & 点运算符 浏览器傻傻分不清
// => "1.10"
1.1.toFixed(2);
// Uncaught SyntaxError: Invalid or unexpected token
1.toFixed(2);
可以看出,在浏览器预解析中,"1.toFixed(2)" 中的点符号会被优先理解成数字常量组成的一部分,也就是 "(1.)toFixed(2)"
那么对浏览器来说,就缺少了调用 toFixed 函数的点运算符。
为什么是语法报错而不是引用/类型报错
按我们的理解, "1toFixed(2)" 的报错应该是
// "Uncaught ReferenceError: 1toFixed is not defined"
// or "VM359:1 Uncaught TypeError: 1toFixed is not a function"
1toFixed(2);
Uncaught SyntaxError 又是哪来的呢?
// Uncaught SyntaxError: Invalid or unexpected token
1.toFixed(2);
我看到报错也是愣了一会,但原因其实非常基础:Function命名规则不能以数字开头
// Uncaught SyntaxError: Invalid or unexpected token
function 1naming() {};
function _1naming() {};
"1naming" 连 Markdown 的 Highlight 都不支持 ~~
以自然语言思维理解浏览器思维
"1.1" 其实可以理解为 Number 的语法糖,为了让浏览器理解我们的意图,我们需要进行额外的处理
(1.).toFixed(2);
// 这是合法语法 ~~
1..toFixed(2);
Number(1.).toFixed(2);
如果我们把语言思维换成英文可能就很好理解:
-
"version 1.2" 会被读成 "version one *dot* two",
-
"1.2x speed" 会被读成 "one *point* two speed",
即使在自然语言中,dot 和 point 也是不一样的 (狗头。

浙公网安备 33010602011771号