2013-03-08 22 views
87

Nie jestem pewien, czy jest to Mozilla specyficznej składni JS, ale często zmienne zadeklarowane w ten sposób, na przykład w add-on SDK docs:Co robią nawiasy klamrowe w instrukcjach `var {...} = ...`?

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

iw różnych chrom Javascript (let oświadczenie jest używany w miejscu z var)

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

znalazłem to bardzo mylące, ale ja nie mogąc znaleźć żadnej dokumentacji na temat zarówno składni, nawet na MDN.

+0

@Blender Jak szukać tej struktury na symbolhound.com? – trusktr

+1

@trusktr: Trochę późno: http://symbolhound.com/?q=javascript&l=&e=var+%7B&n=&u= – Blender

+0

Krótka odpowiedź jest tutaj: https://stackoverflow.com/a/45909752/203704 –

Odpowiedz

53

Obie funkcje JavaScript 1.7. Pierwszym z nich jest block-level variables:

let pozwala zadeklarować zmienne, ograniczając jego zakres do bloku, rachunku lub ekspresji, w którym jest używany. Jest to przeciwieństwo słowa kluczowego var, które definiuje zmienną globalnie lub lokalnie do całej funkcji, niezależnie od zakresu bloku.

Drugi nazywa destructuring:

przyporządkowanie rozpad pozwala na pobieranie danych z tablic lub obiektów za pomocą składni odzwierciedla konstrukcję tablicy i obiektów literałach.
... Jedną ze szczególnie pożytecznych rzeczy, które można wykonać przy pomocy funkcji destructuring assignment, jest przeczytanie całej struktury w pojedynczej instrukcji, chociaż istnieje wiele interesujących rzeczy, które można z nimi zrobić, jak pokazano w sekcji pełnej przykładów co następuje.

Dla obeznanych z Python, jest podobna do tej składni:

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

Pierwszy kod kawałek jest skrótem dla:

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

można przepisać drugi kod klocek jak:

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

Z mojego eksperymentu wygląda na to, że 'var {Hotkey}' jest równoważne 'var {Hotkey: Hotkey}'. Dziękujemy za zlokalizowanie dokumentacji! – timdream

+0

@timdream: Miałem wrażenie, że to coś takiego, ale jak to się różni od 'var Hotkey = require (...). Hotkey'? A może to tylko zapisywanie naciśnięć klawiszy? – Blender

+0

wygląda tak: -/(hehehe, te leniwe programiści ...) – timdream

0

Istnieje dokumentacja rachunku let na MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/let

let jest podobna do var tym, że ogranicza zakres zmiennej zadeklarowanej. To pozwala zadeklarować zmienną wewnątrz bloku if(){} (lub innego bloku) i mieć tę zmienną tylko "widoczną" wewnątrz tego bloku (JavaScript, do tej pory ma zakres funkcji, a nie zakres blokowy jak większość innych języków). Tak więc let jest w zasadzie "poprawką" dla czegoś, z czym wiele osób ma problemy. Zauważ, że tihs to funkcja JavaScript 1.7.

Nie znaleziono niczego na {Foo}.

+0

Dzięki, ale ja pytam o '' {} Foo ... – timdream

+0

Przepraszam, myślałem, że towar z prośbą o jak ... Moje google-fu zawiedzie mnie, jeśli chodzi o '' {} Foo:/ –

+0

ja też: -/Google nie indeksuje '{' i '}'. – timdream

56

To, na co patrzysz, to destrukcja przypisanie pierścienia. Jest to forma pattern matching jak w Haskell.

Korzystanie zadanie destructuring można wyodrębnić wartości z obiektów i tablic i przypisać je do nowo zadeklarowanych zmiennych z wykorzystaniem przedmiotu oraz tablicy składni dosłowne. Dzięki temu kod jest znacznie bardziej zwięzły.

Na przykład:

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

var {a, b, c} = ascii; 

ten kod jest równoważna:

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

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

Podobnie do tablic:

var ascii = [97, 98, 99]; 

var [a, b, c] = ascii; 

Odpowiada to:

var ascii = [97, 98, 99]; 

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

Można również użyć let wyodrębnić, a także zmienić nazwę właściwości obiektu w następujący sposób:

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

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

Jest to odpowiednik:

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

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

To wszystko jest do niego.

+8

+1 dla przykładów destrukturyzacji obiektów, oni " naprawdę pomocne. W MDN [Przykłady] (https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7#Destructuring_assignment_%28Merge_into_own_page.2Fsection%29) wykazują tylko tablicy rozpad. – Blender

+0

@Blender - Zapewniają przykłady destrukturyzacji obiektów. Spójrz na [__Looping w poprzek wartości w tablicy obiektów__] (https://developer.mozilla.org/en-US/docs/JavaScript/New_in_JavaScript/1.7#Looping_across_values_in_an_array_of_objects "Nowość w JavaScript 1.7 - JavaScript | MDN"). –

+0

Miałem na myśli składnię 'var {a, b, c} = ascii;'. – Blender

Powiązane problemy