对象文字中的括号

Parentheses in an object literal

对象字面量中的括号只是分组运算符吗?

node-stringify 将转换:

 [ { a: 1 } ]

到字符串:

 [({'a':1}),({'a':2})]

我可以认为这里的括号对数据没有影响,即没有括号也是完全一样的吗?

是的,(...) 在这种情况下只是用于对表达式进行分组。省略括号不会影响您当前的数据结构。

在对象文字可能被解释为 block statement 的情况下,括号会变得更有用,例如在开发人员控制台中评估表达式时或在 ES6 箭头函数中使用时:

const first = () => {a: 1}
const second = () => ({a: 1})

console.log(first()) //=> undefined
console.log(second()) //=> {a: 1}

我怀疑这就是 node-stringify 提名将它们包含在其输出中的原因——尽可能避免歧义。

我不确定为什么 node-stringify 会像您描述的那样在对象周围加上括号。但是,是的,无论有没有括号,数据结构都是一样的。

这是浏览器中 JSON.stringify 的示例:

var data = [
  {
    'a':1
  },
  {
    'a':2
  }
];

var stringified = JSON.stringify(data);

console.log(stringified);

括号中的结果与 eval 一起使用,具体来说,就是他们如何测试规范文件中的功能。

他们在 GitHub page 本身声明:

// The parenthesis is to make the result work with `eval`
console.assert(stringify({a: 1, b: 2}) === '({a:1,b:2})');

进一步解释: 通常,eval{ 标记解释为块的开始,而不是对象文字的开始。通过将对象包装在括号中,eval 将其解释为完整的 表达式 ,因此 returns 正确解析了对象文字,这对作者测试很重要,否则对其他实现(正如您已经注意到的那样)。