2015-12-22 19 views
72

La domanda che ho è meglio dato attraverso this jsfiddle, il cui codice è qui sotto:letterale oggetto Javascript: cosa è esattamente {a, b, c}?

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

Che tipo di una struttura dati è f? È solo una stenografia per d?

+23

Il primo in realtà non è JSON – GolezTrol

+6

[Questo non è l'unica scorciatoia, ci sono un paio di più in ES6] (https://github.com/lukehoban/es6features # enhanced-object-literals) – Kos

+1

OK @GolezTrol non è strettamente JSON perché le chiavi non sono tra virgolette doppie, quindi cosa esattamente * si * si chiama la struttura dati 'd' nel mio post? – drmrbrewer

risposta

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

E 'venuto con ES6 (ECMAScript 2015) e significa esattamente la stessa:

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

Si chiama letterale oggetto Proprietà Valore Shorthands (o semplicemente il valore della proprietà stenografia, proprietà abbreviate).

È possibile anche combinare abbreviazioni con l'inizializzazione classica:

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

Per ulteriori informazioni vedere Object initializer.

56

Si tratta di un inizializzatore di oggetti Property Shorthand in ES6.

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

Questo funziona perché il valore della proprietà ha lo stesso nome dell'identificatore di proprietà. Questa è una nuova aggiunta alla sintassi di inizializzatore oggetto (section 11.1.5) nell'ultimo ECMAScript 6 draft Rev 13. E, naturalmente, proprio come le limitazioni impostate da ECMAScript 3, non è possibile utilizzare una parola riservata come nome della proprietà.

Una simile stenografia non cambierà drasticamente il codice, ma rende tutto un po 'più dolce!

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

Consultare la tabella di compatibilità per il supporto di queste annotazioni. In ambienti non di supporto, queste annotazioni porteranno a errori di sintassi.

queste abbreviazioni offerte Object Notation corrispondenza abbastanza bene:

In ECMAScript5 quello che abbiamo usato per fare:

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

può essere fatto in ECMAScript6 con una sola riga di codice:

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

Perché questo sarebbe così utile da diventare una funzionalità linguistica? Sembra che sarebbe molto più comune per le persone inizializzare l'oggetto direttamente con valori letterali, valori restituiti e così via, o semplicemente creare prima l'oggetto, quindi impostare direttamente le proprietà. Creare variabili con gli stessi nomi, istanziarle e infine inizializzare l'oggetto come questo sembra inusuale ... o no? – Panzercrisis

+0

@Panzercrisis benvenuto in ES6, è tutto così. – Racheet

+3

@Panzercrisis Sembra che porterebbe a un sacco di bug non intenzionali e difficili da trovare, personalmente. Più o meno allo stesso modo di consentire 'if (a = 1) {...}' come valida sintassi. –

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

Si definisce un oggetto in JavaScript utilizzando il nuovo ECMAScript 2015 notazione:

Secondo Mozilla Developer Network:

"oggetti possono essere inizializzate con new Object(), Object.create(), oppure utilizzando il letterale notazione (notazione inizializzatore). Un inizializzatore di oggetti è un elenco di zero o più coppie di nomi di proprietà e valori associati di un oggetto, racchiuso tra parentesi graffe ({})."

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

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

è equivalente a:.

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

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