2015-04-07 15 views

Odpowiedz

25

@@ opisuje to, co jest znane jako dobrze znany symbol. (Zauważ, że nie jest rzeczywiście ważny składni w JS.) Zgodnie z ES6/ES2015 specification:

Znane symbole są wbudowane w wartości symboli, które są wyraźnie odwołuje algorytmów niniejszej specyfikacji . Są one zwykle używane jako klucze właściwości, których wartości służą jako punkty rozszerzenia algorytmu specyfikacji. O ile nie określono inaczej, dobrze znane wartości symboli są wspólne dla wszystkich dziedzin kodu (8.2).

Kody Dziedziny odnoszą się do różnych instancji środowiska JavaScript. Na przykład Dziedzina kodu głównego dokumentu różni się od dziedziny kodu JavaScript działającej pod numerem .

Przykładem, gdzie ma znaczenie królestwo, z jakiego pochodzi obiekt, to próba użycia instanceof do określenia, czy obiekt jest tablicą (wskazówka: nie zadziała, jeśli pochodzi z innej ramki). Aby uniknąć tego typu problemów z pojawieniem się symboli, są one udostępniane, więc odniesienia do (powiedzmy) @@toString będą działać bez względu na to skąd pochodzi obiekt.

Niektóre z nich są narażone bezpośrednio przez konstruktor Symbol, na przykład @@toPrimitive jest wyeksponowany jako Symbol.toPrimitive. Które mogą być stosowane do zastąpienia wartości wytwarzanej podczas próby konwersji obiektu do pierwotnej wartości, na przykład:

let a = { [Symbol.toPrimitive]:() => 1 }; 
console.log(+a); // 1 
console.log(a.valueOf()); // (the same object) 
console.log(a.toString()); // "[object Object]" 

Ogólnie rzecz biorąc, symbole są stosowane do wytworzenia unikalnych właściwości na przedmiot, który nie może dojść do kolizji z właściwością losowej nazwę, na przykład:

let a = Symbol(); 
let foo = { [a]: 1 }; 
foo[a]; // 1 

nie ma sposobu, aby uzyskać dostęp do wartości z wyjątkiem uzyskania symbolu z gdzieś (choć można dostać wszystkie symbole dla obiektu wywołując Object.getOwnPropertySymbols, więc nie mogą być one wykorzystywane do realizacji prywatnych posesji lub metody).

1: Zobacz dyskusję o różnych nazwach pod numerem this es-discuss topic.

+0

Zauważ, że to nie naprawi klatki 'instanceof'. Lepszym przykładem mogą być iterowalne tablice z ramkami. – Bergi

+0

@Bergi: Próbowałem podać przykład ogólnego problemu z wieloma ramkami, to nie było naprawdę to, co miałem na myśli - może spróbuję to zmienić. –