2013-03-08 7 views
87

nicht sicher, ob dies eine Mozilla-spezifische JS Syntax ist, aber ich fand oft Variablen auf diese Weise erklärt werden, zum Beispiel in add-on SDK docs:Was machen geschweifte Klammern in den `var {...} = ...` Anweisungen?

var { Hotkey } = require("sdk/hotkeys"); 

und in verschiedenen Chrom Javascript (let Anweisung anstelle verwendet wird, um

let { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components; 

von var,) ich fand es sehr verwirrend, aber ich bin keine Dokumentation über beide Syntax zu finden in der Lage, auch auf MDN.

+0

@Blender Wie würden Sie diese Struktur auf symbolhound.com suchen? – trusktr

+1

@trusktr: Ein bisschen spät: http://symbolhound.com/?q=javascript&l=&e=var+%7B&n=&u= – Blender

+0

Die kurze Antwort ist hier: https://Stackoverflow.com/a/45909752/203704 –

Antwort

53

Sie sind beide JavaScript 1.7 Funktionen. Die erste ist block-level variables:

let Sie Variablen deklarieren können, ihren Anwendungsbereich auf den Block, Anweisung zu begrenzen, oder Ausdruck auf dem sie verwendet wird. Dies ist anders als das Schlüsselwort var, das eine Variable global oder lokal für eine gesamte Funktion unabhängig vom Blockbereich definiert.

Der zweite ist destructuring genannt:

Destrukturierung Zuordnung macht es möglich, Daten von Arrays oder Objekten zu extrahieren, eine Syntax, die die Konstruktion von Arrays und Objektliterale spiegelt.
...
Eine besonders nützliche Sache, die Sie mit Destrukturierungsaufgaben machen können, ist das Lesen einer ganzen Struktur in einer einzigen Anweisung, obwohl es eine Reihe von interessanten Dingen gibt, die Sie mit ihnen machen können, wie im Abschnitt Beispiele gezeigt dass folgt.

Für diejenigen, die mit Python, es ist ähnlich wie diese Syntax:

>>> a, (b, c) = (1, (2, 3)) 
>>> a, b, c 
(1, 2, 3) 

Der erste Code Chunk ist eine Abkürzung für:

var {Hotkey: Hotkey} = require("sdk/hotkeys"); 
// Or 
var Hotkey = require("sdk/hotkeys").Hotkey; 

Sie können als den zweiten Code Chunk umschreiben:

let Cc = Components.classes; 
let Ci = Components.interfaces; 
let Cr = Components.results; 
let Cu = Components.utils; 
+1

Aus meinem Experiment sieht "var {Hotkey}" wie 'var {Hotkey: Hotkey}' aus. Danke, dass Sie die Dokumentation gefunden haben! – timdream

+0

@timdream: Ich hatte das Gefühl, dass es so etwas ist, aber wie unterscheidet sich das von 'var Hotkey = require (...). Hotkey'? Oder speichert es nur Tastenanschläge? – Blender

+0

sieht so aus: -/(hehehe, diese faulen Programmierer ...) – timdream

0

Es ist die Dokumentation für die let Aussage über MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

let ist ähnlich var, dass sie den Umfang der deklarierten Variablen begrenzt. Es erlaubt Ihnen, eine Variable innerhalb eines if(){} Blocks (oder eines anderen Blocks) zu deklarieren und diese Variable nur innerhalb dieses Blocks "sichtbar" zu haben (JavaScript hat bis jetzt den Funktionsumfang und nicht den Block wie die meisten anderen Sprachen). Also ist die let im Grunde ein "Fix" für etwas, mit dem viele Leute Probleme haben. Beachten Sie, dass tihs eine JavaScript 1.7-Funktion ist.

Haben Sie nichts gefunden auf {Foo}.

+0

Danke, aber ich frage nach '{Foo}' ... – timdream

+0

Entschuldigung, ich dachte, du fragst nach beiden ... Mein Google-Fu scheitert mir, wenn es darum geht '{Foo}':/ –

+0

Ich auch: -/Google indiziert nicht '{' und '}'. – timdream

56

Was Sie suchen, ist ein Destructu Ringzuweisung. Es ist eine Form von pattern matching wie in Haskell.

Mithilfe der Destrukturierungszuweisung können Sie Werte aus Objekten und Arrays extrahieren und sie mithilfe der Objekt- und Array-Literalsyntax neu deklarierten Variablen zuweisen. Dies macht den Code viel prägnanter.

Zum Beispiel:

var ascii = { 
    a: 97, 
    b: 98, 
    c: 99 
}; 

var {a, b, c} = ascii; 

Der obige Code entspricht:

var ascii = { 
    a: 97, 
    b: 98, 
    c: 99 
}; 

var a = ascii.a; 
var b = ascii.b; 
var c = ascii.c; 

Ähnlich für Arrays:

var ascii = [97, 98, 99]; 

var [a, b, c] = ascii; 

Dies ist äquivalent zu:

var ascii = [97, 98, 99]; 

var a = ascii[0]; 
var b = ascii[1]; 
var c = ascii[2]; 

Sie können auch let verwenden sowie umbenennen eine Objekteigenschaft zu extrahieren, wie folgt:

var ascii = { 
    a: 97, 
    b: 98, 
    c: 99 
}; 

var A = ascii.a; 
var B = ascii.b; 
var C = ascii.c; 

das alles gibt es zu ihm ist:

var ascii = { 
    a: 97, 
    b: 98, 
    c: 99 
}; 

let {a: A, b: B, c: C} = ascii; 

Dies äquivalent ist.

+8

+1 für die Beispiele zur Destrukturierung von Objekten. wirklich hilfreich. In den [MDN-Beispielen] (https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7#Destructuring_assignment_%28Merge_into_own_page.2Fsection%29) wird nur die Struktur des Arrays angezeigt. – Blender

+0

@Blender - Sie bieten Beispiele für die Destrukturierung von Objekten. Sehen Sie sich [__Looping über Werte in einem Array von Objekten__] an (https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7#Looping_across_values_in_an_array_of_objects "Neu in JavaScript 1.7 - JavaScript | MDN"). –

+0

Ich meinte die Syntax 'var {a, b, c} = ascii;'. – Blender

Verwandte Themen