98

The question I have is best given by way of this jsfiddle, the code for which is below:

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

What sort of a data structure is f? Is it just a shorthand for d?

2

3 Answers 3

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

It came with ES6 (ECMAScript 2015) and means exactly the same as:

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

It is called Object Literal Property Value Shorthands (or simply property value shorthand, shorthand properties).

You can also combine shorthands with classical initialization:

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

For more information see Property definitions in Object initializer.

75

It is an Object Initializer Property Shorthand in ES6.

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

This works because the property value has the same name as the property identifier. This a new addition to the syntax of Object Initialiser (section 11.1.5) in the latest ECMAScript 6 draft Rev 13. And of course, just like the limitations set from ECMAScript 3, you can’t use a reserved word as your property name.

Such a shorthand won’t dramatically change your code, it only makes everything a little bit sweeter!

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

Please see the compatibility table for support for these notations. In non-supporting environments, these notations will lead to syntax errors.

This shorthand notation offers object matching pretty nicely:

In ECMAScript5 what we used to do:

var tmp = getData();
var op  = tmp.op;
var lhs = tmp.lhs;
var rhs = tmp.rhs;

Can be done in ECMAScript6 with a single line of code:

var { op, lhs, rhs } = getData();
13
  • 10
    Why would this be so useful as to become a language feature? It seems like it would be much more common for people to either initialize the object directly with literals, return values, and such, or to just create the object first, then set the properties directly. Creating variables with the same names, instantiating them, and then finally initializing the object like this just seems unusual...or does it? Commented Dec 22, 2015 at 15:27
  • 3
    @Panzercrisis It seems like it would just lead to a lot of unintended and hard to find bugs, personally. Much the same way that allowing if(a = 1) {...} as valid syntax does. Commented Dec 22, 2015 at 16:27
  • 1
    @Panzercrisis I think it at least makes sense if you imagine that a, b, and c as more complex data structures and f also containing other complex properties. Still not sure it's a great idea, but I could see that being useful. Commented Dec 22, 2015 at 23:10
  • 1
    @Panzercrisis it can be very useful to return a tuple from a lambda function, something like (a, b) => {a, b}. That's at least how I used the same feature in C#. Commented Dec 23, 2015 at 6:00
  • 2
    @Alex how is this a "quirk" or "complex"? A very common thing you'd normally find in many codebases is initialising an object where the key matches the variable given as value {id: id, data: data, isSelected: isSelected} etc. Happens a lot when mapping objects coming in to local ones and then back. In the majority of cases you don't want to name your stuff slightly differently {identifier: id, viewData: data, isElementSelected: isSelected } is exactly that "quirky", "complex" and "confusing" you are talking about.
    – VLAZ
    Commented Feb 22, 2019 at 12:29
13
var f = {a, b, c};          // <--- what exactly is this??

It defines an object in JavaScript using the new ECMAScript 2015 notation:

As per Mozilla Developer Network:

"Objects can be initialized using new Object(), Object.create(), or using the literal notation (initializer notation). An object initializer is a list of zero or more pairs of property names and associated values of an object, enclosed in curly braces ({})."

var a = "foo", 
    b = 42, 
    c = {};

// Shorthand property names (ES6)
var o = { a, b, c }; 

is equivalent to:

var a = "foo", 
    b = 42,
    c = {};

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

Not the answer you're looking for? Browse other questions tagged or ask your own question.