不寻常的对象定义

Joh*_*son 3 javascript

我偶然发现了这个奇怪的物体声明.

var config = {};
{ 
  config.foo = 'foo';
  config.bar = 'bar';
};
Run Code Online (Sandbox Code Playgroud)

它有效,但我猜它不会.

困惑我在Chrome DevTools中打开控制台,然后输入:

var a = {};
// => undefined
Run Code Online (Sandbox Code Playgroud)

到目前为止没什么奇怪的.但后来我输入:

{ a.b = 'b'; }
// => Uncaught SyntaxError: Unexpected token .
Run Code Online (Sandbox Code Playgroud)

好吧,嗯......这不应该有用吗?另一种尝试,没有单独评估报表:

var a = {}; {a.b = 'b'};
// => "b"
Run Code Online (Sandbox Code Playgroud)

嗯,没有抛出SyntaxError.如果我评估一个,我可以看到它是按照我的意图定义的.

a;
// => Object {b: "b"}
Run Code Online (Sandbox Code Playgroud)

怎么了?我试图谷歌它,但我不知道要搜索什么,我缺乏某种知识来弄清楚发生了什么.有人可以解释一下吗?

Tus*_*har 5

在代码中,

var config = {};
{ 
  config.foo = 'foo';
  config.bar = 'bar';
};
Run Code Online (Sandbox Code Playgroud)

第二里面的代码{}只是语句块分组.该块用于对多个语句进行分组,并且是有效的语法,因此不会引发错误.

代码相当于

var config = {};
config.foo = 'foo';
config.bar = 'bar';
Run Code Online (Sandbox Code Playgroud)

执行块内的代码,config对象是

{foo: "foo", bar: "bar"}
Run Code Online (Sandbox Code Playgroud)

执行块后.

不使用上面的语法,最好使用对象文字语法来定义对象.

var config = {
    foo: 'foo',
    bar: 'bar
};
Run Code Online (Sandbox Code Playgroud)

与代码相同

var a = {}; {a.b = 'b'};
Run Code Online (Sandbox Code Playgroud)

这相当于

var a = {};
a.b = 'b';
Run Code Online (Sandbox Code Playgroud)

并且可以写成

var a = {
    b: 'b';
};
Run Code Online (Sandbox Code Playgroud)

来自MDN Docs

块语句(或复合语句在其他语言)用于组零个或多个声明.该块由一对花括号分隔.


{ a.b = 'b'; }throws Uncaught SyntaxError:意外的令牌.

如果a未声明变量,则会抛出错误.