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
的简写吗?#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
};
评论
第一个实际上不是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将其反序列化为对象。