js 为什么对同一个数组执行2次forEach 如果第一个forEach语句结束后不加上分号 第二个forEach报错?

作者站长头像
站长
· 阅读数 12

我新建了一个简单的测试页 html 在 script 标签内写了 3 种情况的代码

情况1 注意 语句后面没有分号

[1,2].forEach(i=>console.log(i))//1,2
[1,2].forEach(i=>console.log(i))//报错

情况2 用一个去接收数组 同样语句后不加上分号

const arr = [1,2];
arr.forEach(i=>console.log(i))//1,2
arr.forEach(i=>console.log(i))//1,2

情况3 情况1的代码 但是执行语句后有分号

[1,2].forEach(i=>console.log(i));//1,2
[1,2].forEach(i=>console.log(i));//1,2
回复
1个回答
avatar
test
2024-06-30
[1,2].forEach(i=>console.log(i))
[1,2].forEach(i=>console.log(i))

由于第一句没有分号,根据 ASI 算法会被解析成:

[1,2].forEach(i=>console.log(i)) /*一个表达式*/ [1,2] /*取下标*/ .forEach(i=>console.log(i)) /*在结果(自然是 undefined)上调用 forEach*/

因而报错:

Uncaught TypeError: can't access property 2, [1, 2].forEach(...) is undefined

常见的处理分号的风格:

  • 每一句都加分号
  • 需要的地方句首加分号

需要注意的类似情况:

  • 行首的 () 可能被解析为函数调用
  • 行首的数组解构 [] 可能被解析成下标

参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refer...

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容