2015-12-22 15 views
72

Mam pytanie najlepiej podane tytułem this jsfiddle, dla których kod jest poniżej:Skrypt do obiektu JavaScript: czym dokładnie jest {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); 

Jakie struktury danych jest f? Czy jest to skrót dla d?

+23

Pierwszy z nich faktycznie nie jest JSON – GolezTrol

+6

[To nie jest tylko skrótem, istnieje niewiele więcej w ES6] (https://github.com/lukehoban/es6features # enhanced-object-literals) – Kos

+1

OK @GolezTrol to nie jest ściśle JSON, ponieważ klucze nie znajdują się w podwójnych cudzysłowach. Więc co dokładnie mógłbyś nazwać strukturą danych "d" w moim poście? – drmrbrewer

Odpowiedz

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

Przyszedł z ES6 (ECMAScript 2015) i oznacza dokładnie to samo:

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

nazywany jest literał obiektu Własności Wartość shorthands (lub po prostu wartość nieruchomości skróconą, właściwości skrócone).

Można również połączyć Shorthands z klasycznego inicjalizacji:

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

Więcej informacji można znaleźć Object initializer.

56

Jest to inicjator obiektów Property Shorthand w ES6.

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

Działa to, ponieważ wartość właściwości ma taką samą nazwę jak identyfikator właściwości. Jest to nowe uzupełnienie składni obiektu Object Initialiser (section 11.1.5) w najnowszym ECMAScript 6 draft Rev 13. Oczywiście, podobnie jak ograniczenia ustalone w ECMAScript 3, nie można używać zastrzeżonego słowa jako nazwy właściwości.

Taki skrót nie zmieni radykalnie kodu, tylko sprawi, że wszystko będzie trochę słodsze!

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

Proszę sprawdzić tabelę zgodności, aby uzyskać wsparcie dla tych notacji. W środowiskach nie wspierających te zapisy będą prowadzić do błędów składniowych.

To skrócone oferty Object Notation dopasowania całkiem ładnie:

W ECMAScript5 co zwykliśmy robić:

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

można zrobić w ECMAScript6 z jednej linii kodu:

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

Dlaczego byłoby to tak przydatne, aby stać się funkcją językową? Wygląda na to, że znacznie częściej ludzie inicjują obiekt bezpośrednio za pomocą literałów, zwracają wartości i tak dalej, lub po prostu najpierw tworzą obiekt, a następnie ustawiają właściwości bezpośrednio. Tworzenie zmiennych o tych samych nazwach, tworzenie ich, a następnie inicjowanie obiektu takiego jak ten wydaje się po prostu niezwykłe ... czy to prawda? – Panzercrisis

+0

@Panzercrisis witamy w ES6, to wszystko. – Racheet

+3

@Panzercrisis Wygląda na to, że doprowadziłoby to do wielu niezamierzonych i trudnych do znalezienia błędów osobiście. Tak samo, jak w przypadku wyrażenia "if (a = 1) {...}", tak jak w przypadku prawidłowej składni. –

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

Definiuje obiektu w JavaScript użyciu nowego ECMAScript 2015 oznaczenia:

Per Mozilla Developer Network:

„obiekty można zainicjować za pomocą nowego obiektu(), Object.create() lub jawnego notacja (zapis inicjalizacyjny). Inicjator obiektów to lista zero lub więcej par nazw właściwości i powiązanych wartości obiektu, ujęta w nawiasy klamrowe ({})."

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

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

jest równoważna.

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

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