Javascript对象文字:{a,b,c}到底是什么?
我的问题最好通过以下方式提出,代码如下:Javascript对象文字:{a,b,c}到底是什么?,javascript,ecmascript-6,Javascript,Ecmascript 6,我的问题最好通过以下方式提出,代码如下: 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: a
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 );
var a=1,b=x,c=true;
var d={a:a,b:b,c:c};//
它与ES6(ECMAScript 2015)一起提供,其含义与以下内容完全相同:
var f = {a: a, b: b, c: c};
它被称为对象文字属性值速记(或简单的属性值速记,速记属性)
您还可以将速记与经典初始化相结合:
var f = {a: 1, b, c};
有关更多信息,请参阅。它是ES6中的对象初始值设定项
这是因为属性值与属性标识符具有相同的名称。这是对最新版本中对象初始化器()语法的新添加。当然,就像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.
}
有关这些符号的支持,请参见兼容性表。在非支持环境中,这些符号将导致语法错误
这个速记符号提供了非常好的对象匹配:
在ECMAScript 5中,我们过去的工作是:
var tmp = getData();
var op = tmp.op;
var lhs = tmp.lhs;
var rhs = tmp.rhs;
只需一行代码即可在ECMAScript 6中完成:
var { op, lhs, rhs } = getData();
相当于:
var a = "foo",
b = 42,
c = {};
var o = {
a: a,
b: b,
c: c
};
第一个实际上不是JSON.OK@GolezTrol它不是严格意义上的JSON,因为键不在双引号中。那么,在我的帖子中,您将d
数据结构称为什么呢?重要的是要理解,没有一个版本是有效的JSON。将数据表示为JSON字符串的方法是{“a”:1,“b”:“x”,“c”:true}
@drmrbrewer它是一个字符串。它不是JSON,因为它是javascript代码,而JSON是一种序列化格式。例如var a='{“a”:“value”}'
->a
包含一个字符串,可以通过JSON.parse
反序列化到一个对象。为什么这会如此有用,成为一种语言功能?对于人们来说,使用文本、返回值等直接初始化对象,或者先创建对象,然后直接设置属性,这似乎更为常见。创建具有相同名称的变量,实例化它们,然后最终像这样初始化对象似乎很不寻常……或者是这样吗?@Panzercrisis就个人而言,这似乎只会导致许多意外的、难以发现的bug。与允许if(a=1){…}
作为有效语法的方式大致相同。@Panzercrisis我认为,如果您将a、b和c想象为更复杂的数据结构,并且f还包含其他复杂属性,则至少是有意义的。我仍然不确定这是一个好主意,但我认为这很有用。@Panzercrisis从lambda函数返回元组可能非常有用,比如(a,b)=>{a,b}
。这至少是我在C#
@Alex中使用相同功能的方式,这是一个“怪癖”还是“复杂”?在许多代码库中,您通常会发现一件非常常见的事情是初始化一个对象,其中键与作为value{id:id,data:data,isSelected:isSelected}
等给定的变量相匹配。将对象映射到本地对象然后再映射回来时,经常会发生这种情况。在大多数情况下,你不想给你的东西起个稍微不同的名字
{identifier:id,viewData:data,isElementSelected:isSelected}正是你所说的“古怪”、“复杂”和“混乱”。
var { op, lhs, rhs } = getData();
var f = {a, b, c}; // <--- what exactly is this??
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
};