使用此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行,它在做什么?
答案 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']