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

Fli*_*imm 3 javascript syntax

拿这个Javascript代码:

foobar = {}
["one", "two"].forEach(item => {
  console.log(item)
})
Run Code Online (Sandbox Code Playgroud)

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

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

TypeError: Cannot read property 'forEach' of undefined
Run Code Online (Sandbox Code Playgroud)

不过,如果你在第一行的末尾手动添加一个分号foobar = {};,您不再收到此错误,而不是你的预期输出onetwo.

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

foobar = {} ["one", "two"];
console.log(foobar);
Run Code Online (Sandbox Code Playgroud)

这实际上打印undefined没有抛出错误!我没想到的是!

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

Soo*_*lie 6

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

{}["one", "two"]
Run Code Online (Sandbox Code Playgroud)

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

undefined.forEach(...)
Run Code Online (Sandbox Code Playgroud)


Ska*_*ski 5

解析器认为您的意思是:

foobar.two // foobar['two'] = foobar.two
Run Code Online (Sandbox Code Playgroud)

在行动中:

foobar = {one:1,two:2}
["one", "two"] // returns 2
Run Code Online (Sandbox Code Playgroud)

这样想:

obj = {};
obj.foo = 1;
obj['foo']; // equales 1
obj;['foo']; // equales obj {foo:1}, ['foo']
Run Code Online (Sandbox Code Playgroud)