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