2015-06-16 19 views
8
var obj = { type: 'data', x, y, data: []} 

Ovviamente questo era il mio errore di battitura, {x,y} dovrebbe essere stato {x: x, y: y}. Ma fa quello che voglio, in Chrome, il campo x ottiene il valore di una variabile locale x.perché obj = {x, y} funziona in Chrome?

Ma perché funziona?

+0

Versione 43.0.2357.81 Costruito su Ubuntu 14.04, eseguito su LinuxMint 17.1 (64-bit) – exebook

risposta

11

Fa parte di ECMAScript 2015 (o ECMAScript 6). È possibile creare nuove proprietà in Oggetti in letterali Object, semplicemente specificando gli identificatori.

Citando MDN's Object Initializer's Property Definitions section,

Con ECMAScript 6, v'è una notazione più breve disponibile per ottenere lo stesso:

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

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

La sezione corrispondente ECMAScript specifica 6 è here,

AssignmentProperty: IdentifierReferenceInitializer opt

  1. Let P essere StringValue di IdentifierReference.
  2. Lasciare lref be ResolveBinding (P).
  3. ReturnIfAbrupt (P).
  4. Let v essere GetV (valore, P).
  5. ReturnIfAbrupt (v).
  6. Se Initializer opt è presente e v è indefinito, quindi
    1. Let defaultValue essere il risultato della valutazione Initializer.
    2. Lasciate v be GetValue (defaultValue).
    3. ReturnIfAbrupt (v).
    4. Se IsAnonymousFunctionDefinition (Initializer) è vero, quindi
      1. Let hasNameProperty essere hasOwnProperty (v, "nome").
      2. ReturnIfAbrupt (hasNameProperty).
      3. Se hasNameProperty è falso, eseguire SetFunctionName (v, P).
  7. Return PutValue (Lref, v).

In sostanza, la specifica dice che, se si utilizza solo un identificatore, verrà creata una nuova proprietà con il nome del identificatore, e il valore sarà il valore effettivo di tale identificatore. Può anche essere un nome della funzione.

var a = "foo", b = 42, c = {}, d = function() {};  
console.log({a, b, c, d}); 
// { a: 'foo', b: 42, c: {}, d: [Function] } 
5

ES2015 ha una notazione letterale dell'oggetto migliorata. Chrome 43ish supporta questo (parzialmente).

Babel ha una buona spiegazione.

Problemi correlati