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"

即使在自然语言中,dotpoint 也是不一样的 (狗头。

posted @ 2021-07-05 16:22  97z4moon  阅读(123)  评论(0)    收藏  举报
Title