--- title: Symbol slug: Web/JavaScript/Reference/Global_Objects/Symbol tags: - ECMAScript 2015 - ECMAScript6 - JavaScript - Symbol translation_of: Web/JavaScript/Reference/Global_Objects/Symbol ---
La funzione Symbol()
restituisce un valore di tipo symbol, dispone di proprietà statiche che espongono diversi membri di oggetti built-in, ha metodi statici che espongono il registro globale dei symbol, ed assomiglia all'oggetto built-in class, ma non dispone di un costruttore e non supporta la sintassi "new Symbol()
".
Ogni valore symbol restituito da Symbol()
è unico. Un valore symbol può essere utilizzato come identificatore per proprietà di un oggetto; questo è lo scopo di tale tipo di dati. Ulteriori spiegazioni circa il loro scopo ed uso può essere trovato nella pagina: glossary entry for Symbol.
Il tipo di dati symbol è un {{Glossary("Primitive", "primitive data type")}}.
Symbol([description])
description
{{optional_inline}}Per creare un nuovo primitive symbol, scrivereSymbol()
con una stringa opzionale di descrizione:
var sym1 = Symbol(); var sym2 = Symbol('foo'); var sym3 = Symbol('foo');
Il codice sopra crea tre nuovi symbol. Notare che Symbol("foo")
non costringe la stringa "foo" in un symbol. Esso crea un nuovo symbol ogni volta:
Symbol('foo') === Symbol('foo'); // false
La sintassi seguente con l'operatore {{jsxref("Operators/new", "new")}} genererà un {{jsxref("TypeError")}}:
var sym = new Symbol(); // TypeError
Questo previene gli autori dal creare un esplicito oggetto wrapper Symbol
invece di un nuovo valore symbol e la cosa può sorprendere in quanto creare un oggetto wrapper esplicito attorno ad un tipo di dati primitivo è generalmente possibile (ad esempio, new Boolean
, new String
e new Number
).
Se veramente si vuole creare un oggetto wrapper Symbol
si può usare la funzione Object()
:
var sym = Symbol('foo'); typeof sym; // "symbol" var symObj = Object(sym); typeof symObj; // "object"
La sintassi vista sopra che utilizza la funzione Symbol()
non crea un symbol globale che sarà disponibile nell'intero codebase. Per creare dei symbol disponibili attraverso diversi files ed anche attraverso diversi realms (ognuno dei quali ha il proprio global scope), usare i metodi {{jsxref("Symbol.for()")}} e {{jsxref("Symbol.keyFor()")}} per impostare e leggere i symbol dal registro globale.
Il metodo {{jsxref("Object.getOwnPropertySymbols()")}} restituisce un array di symbol e permette di trovare le proprietà symbol di un oggetto. Notare che ogni oggetto è inizializzato senza alcuna proprietà symbol, per cui l'array restituito sarà vuoto a meno che una proprietà symbol non sia stata creata sull'oggetto.
Symbol.length
Symbol
.In aggiunta ai symbol definiti da voi, JavaScript dispone di alcuni symbol built-in che rappresentano alcuni comportamenti interni del linguaggio che non sono esposti agli sviluppatori in ECMAScript5 e precedenti. A tali symbol si può accedere tramite le seguenti proprietà:
for...of
.for await of
.with
environment bindings of the associated object.Symbol
prototypeTutti i simboli ereditano da {{jsxref("Symbol.prototype")}}.
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Properties')}}
{{page('en-US/Web/JavaScript/Reference/Global_Objects/Symbol/prototype','Methods')}}
typeof
operator with symbolsL'operatore {{jsxref("Operators/typeof", "typeof")}} può aiutare ad identificare i symbol.
typeof Symbol() === 'symbol' typeof Symbol('foo') === 'symbol' typeof Symbol.iterator === 'symbol'
Alcune cose da notare quando si lavora con le conversioni di tipo dei symbol.
+sym
or sym | 0
).Object(sym) == sym
restituisce true.
Symbol("foo") + "bar"
lancia un {{jsxref("TypeError")}} (non si può convertire un symbol in stringa). Questo previene, ad esempio, la creazione silenziosa di un nuovo nome di proprietà stringa da un symbol.String(sym)
conversion funziona come una chiamata a {{jsxref("Symbol.prototype.toString()")}} con symbol, ma notare che new String(sym)
genererà un errore.for...in
I symbol non sono enumerabili in un'iterazione for...in
. In aggiunta, {{jsxref("Object.getOwnPropertyNames()")}} non restituirà le proprietà symbol dell'oggetto, tuttavia, si puù usare {{jsxref("Object.getOwnPropertySymbols()")}} per ottenerle.
var obj = {}; obj[Symbol('a')] = 'a'; obj[Symbol.for('b')] = 'b'; obj['c'] = 'c'; obj.d = 'd'; for (var i in obj) { console.log(i); // logs "c" and "d" }
JSON.stringify()
Le proprietà le cui chiavi sono symbol vengono completamente ignorate da JSON.stringify()
:
JSON.stringify({[Symbol('foo')]: 'foo'}); // '{}'
Per ulteriori dettagli, vedere {{jsxref("JSON.stringify()")}}.
Quando un oggetto wrapper symbol viene usato come chiave di una proprietà, tale oggetto verrà costretto al suo wrapped symbol:
var sym = Symbol('foo'); var obj = {[sym]: 1}; obj[sym]; // 1 obj[Object(sym)]; // still 1
Specificazione | Stato | Commento |
---|---|---|
{{SpecName('ES2015', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ES2015')}} | Initial definition |
{{SpecName('ESDraft', '#sec-symbol-objects', 'Symbol')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Symbol")}}