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

问题描述 投票:3回答:2

拿这个Javascript代码:

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

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

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

TypeError: Cannot read property 'forEach' of undefined

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

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

foobar = {} ["one", "two"];
console.log(foobar);

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

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

javascript syntax
2个回答
6
投票

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

{}["one", "two"]

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

undefined.forEach(...)

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']
© www.soinside.com 2019 - 2024. All rights reserved.