我最好的问题是通过以下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的简写吗?

评论

第一个实际上不是JSON。

这不是唯一的速记,ES6中还有更多速记

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

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

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

#1 楼

这是ES6中的对象初始化程序属性速记。

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();


评论


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

–装甲危机
2015年12月22日15:27



@Panzercrisis看来,就个人而言,这似乎会导致很多意想不到且难以发现的错误。与允许if(a = 1){...}的合法语法几乎一样。

–安东尼·格里斯
15年12月22日在16:27

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

–乔什·朗姆布(Josh Rumbut)
15年12月22日在23:10

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

– Vincent van der Weele
2015年12月23日下午6:00



@Alex这是一个“怪异”或“复杂”的现象吗?您通常会在许多代码库中找到一个非常普通的事情,即初始化一个对象,该对象的键与给定的变量匹配,其值为{id:id,data:data,isSelected:isSelected}等。在将对象映射到本地时发生很多事情一个,然后返回。在大多数情况下,您不想以不同的名称命名{identifier:id,viewData:data,isElementSelected:isSelected}就是您所说的“古怪”,“复杂”和“令人困惑”。

– VLAZ
19-2-22在12:29

#2 楼

var f = {a, b, c};


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

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


它称为对象文字属性值简写(或简写为属性值的简写形式(速记属性)。

还可以将简写形式与经典初始化结合在一起: 。

#3 楼

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
};