对象文字中的括号
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 正确解析了对象文字,这对作者测试很重要,否则对其他实现(正如您已经注意到的那样)。
对象字面量中的括号只是分组运算符吗?
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 正确解析了对象文字,这对作者测试很重要,否则对其他实现(正如您已经注意到的那样)。