Javascript对象文字:究竟是什么{a,b,c}?

时间:2015-12-22 11:22:40

标签: javascript ecmascript-6

我的问题最好通过this jsfiddle给出,其代码如下:

sudo -i

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的简写吗?

3 个答案:

答案 0 :(得分:77)

var f = {a, b, c};

它附带ES6(ECMAScript 2015),意思与:

完全相同
var f = {a: a, b: b, c: c};

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

您还可以将简写与经典初始化结合起来:

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

有关详细信息,请参阅Object initializer

答案 1 :(得分:65)

它是ES6中的对象初始值设定项Property Shorthand

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

这是有效的,因为属性值与属性标识符具有相同的名称。这是最新section 11.1.5 Object Initialiser ECMAScript 6 draft Rev 13)语法的新增内容。当然,就像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 = getDate();
var op  = tmp.op;
var lhs = tmp.lhs;
var rhs = tmp.rhs;

可以使用一行代码在 ECMAScript6 中完成:

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

答案 2 :(得分:12)

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

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

根据Mozilla Developer Network

“可以使用新的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
};