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

我新建了一个简单的测试页 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.7k
2 个回答
[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...

看了一下第一行的末尾没有分号,JS没有立即结束这一行,而是把下一行的代码和它合并。这就导致了问题,要加分号来结束语句,但是js大部分是可选的,根据情况去选择加分号
企业微信截图_16897350282818.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题