JavaScript对象文字:{a,b,c}到底是什么?


88

我的问题最好通过以下方式给出 此jsfiddle给出,其代码如下:

var a = 1, b = 'x', c = true;

var d = {a: a, b: b, c: c}; // <--- object literal
var e = [a, b, c];          // <--- array
var f = {a, b, c};          // <--- what exactly is this??

// these all give the same output:
alert(d.a  + ', ' + d.b +  ', ' + d.c );
alert(e[0] + ', ' + e[1] + ', ' + e[2]);
alert(f.a  + ', ' + f.b +  ', ' + f.c );

什么样的数据结构是f?这只是简写d吗?


25
第一个实际上不是JSON。
GolezTrol 2015年


1
OK @GolezTrol它不是严格的JSON,因为键不在双引号中。那么,您在我的帖子中究竟d数据结构称为什么?
drmrbrewer 2015年

6
重要的是要了解所有版本都不是有效的JSON。将数据表示为JSON字符串的方式是{"a" : 1, "b" : "x", "c" : true }
Benjamin Gruenbaum 2015年

14
@drmrbrewer这是一个对象文字。它不是JSON,因为它是javascript代码,而JSON是序列化格式。例如var a = '{ "a" : "value"}'->a持有一个字符串,可以通过将该字符串反序列化为一个对象JSON.parse
moonwave99

Answers:


71

它是ES6中的Object Initializer属性速记

var f = {a, b, c, d:1}; // Will be equal to {a:a, b:b, c:c, d:1}

这是可行的,因为属性值与属性标识符具有相同的名称。这是最新ECMAScript 6草案Rev 13对象初始化程序第11.1.5节)的语法的新补充。。当然,就像ECMAScript 3中设置的限制一样,您不能使用保留字作为属性名称。

这样的简写不会显着改变您的代码,只会使所有内容变得更甜蜜!

function createCar(name, brand, speed) {
  return { type: 'Car', name: name, brand: brand, speed: speed };
}

// With the new shorthand form
function createSweetCar(name, brand, speed) {
  return { type: 'Car', name, brand, speed }; // Yes it looks sweet.
}

请参阅兼容性表以获取对这些符号的支持。在不支持的环境中,这些符号将导致语法错误。

这种简写形式可以很好地匹配对象:

ECMAScript5中,我们曾经做过的事情:

var tmp = getData();
var op  = tmp.op;
var lhs = tmp.lhs;
var rhs = tmp.rhs;

只需一行代码即可在ECMAScript6中完成:

var { op, lhs, rhs } = getData();

10
为什么这会成为语言功能如此有用?对于人们来说,直接使用文字直接初始化对象,返回值等等,或者先创建对象然后直接设置属性,这似乎更为普遍。创建具有相同名称的变量,实例化它们,然后最终像这样初始化对象似乎很不寻常……或者是吗?
Panzercrisis

3
@Panzercrisis看来,就个人而言,这似乎会导致很多意外和难以发现的错误。与允许if(a = 1) {...}有效语法的方式几乎相同。
安东尼·格里斯

1
@Panzercrisis我认为,如果您将a,b和c想象为更复杂的数据结构,而f也包含其他复杂属性,那至少是有道理的。仍然不确定这是个好主意,但我可以看到它很有用。
Josh Rumbut 2015年

1
@Panzercrisis,从lambda函数返回一个元组可能非常有用,例如(a, b) => {a, b}。至少这是我在中使用相同功能的方式C#
Vincent van der Weele 2015年

2
@Alex这是一个“怪异”或“复杂”的现象吗?通常在许多代码库中常见的一个常见问题是初始化一个对象,该对象的键与给定值的变量匹配,{id: id, data: data, isSelected: isSelected}以此类推。将对象映射到本地对象然后再映射回本地时,会发生很多事情。在大多数情况下,您不想以不同的{identifier: id, viewData: data, isElementSelected: isSelected }方式命名您的东西,恰恰是您所说的“古怪”,“复杂”和“令人困惑”。
VLAZ

77
var f = {a, b, c};

ES6(ECMAScript 2015)随附它,其含义与以下内容完全相同:

var f = {a: a, b: b, c: c};

它称为对象文字属性值简写(或简称为属性值简写,简写属性)。

您还可以将速记与经典初始化结合在一起:

var f = {a: 1, b, c};

有关更多信息,请参见对象初始化器


12
var f = {a, b, c};          // <--- what exactly is this??

它使用新的ECMAScript 2015表示法在JavaScript中定义一个对象:

根据Mozilla开发人员网络

“可以使用new Object(),Object.create()或文字表示法(初始化器表示法)来初始化对象。对象初始化器是零对或多对属性名称和对象的关联值的列表,并包含在其中大括号 ({})。”

var a = "foo", 
    b = 42, 
    c = {};

// Shorthand property names (ES6)
var o = { a, b, c }; 

等效于:

var a = "foo", 
    b = 42,
    c = {};

var o = { 
  a: a,
  b: b,
  c: c
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.