为什么在分配对象文字后不插入分号?

时间:2017-11-20 10:42:01

标签: javascript syntax

使用此Javascript代码:

foobar = {}
["one", "two"].forEach(item => {
  console.log(item)
})

如果您在浏览器或Node中运行此代码,则会收到此错误:

hi.js:2
["one", "two"].forEach(item => {
               ^

TypeError: Cannot read property 'forEach' of undefined

但是,如果您在第一行[{1}}的末尾手动添加分号,则不会再出现此错误,而是获得foobar = {};和{{1}的预期输出}。

我知道Javascript有自动分号插入,我知道很多人建议总是使用分号以避免这样的问题。我的问题是关于这种情况:为什么在第一行末尾没有自动插入分号?对象文字,后跟数组文字,是无效的Javascript语法,是吗?让我看看:

one

这实际上打印two而不会抛出错误!我没想到!

所以我想我真正的问题是:为什么是一个对象文字,后跟一个数组文字,在一个赋值中,被认为是一个语法正确的Javascript行,它在做什么?

2 个答案:

答案 0 :(得分:6)

在解析器视图中,当您不添加;时,解析器将其视为:

{}["one", "two"]

空对象的索引,不可用。所以它在技术上是一个参考错误,因为它不存在或undefined。如此有效,这被解释为:

undefined.forEach(...)

答案 1 :(得分:5)

解析器认为你的意思是:

foobar.two // foobar['two'] = foobar.two

在行动中:

foobar = {one:1,two:2}
["one", "two"] // returns 2

这样想:

obj = {};
obj.foo = 1;
obj['foo']; // equales 1
obj;['foo']; // equales obj {foo:1}, ['foo']