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 primitive data type.

Syntax

Symbol([description])

Parametri

description Optional
Opzionale, string. Una descrizione del symbol che può essere usata per il debug ma non per accedere al symbol stesso.

Descrizione

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 new genererà un 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"

Symbols condivisi nel registro globale dei symbol

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 Symbol.for() e Symbol.keyFor() per impostare e leggere i symbol dal registro globale.

Cercare le proprietà symbol negli oggetti

Il metodo 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.

Proprietà

Symbol.length
Proprietà "lunghezza", il cui valore è 0.
Symbol.prototype
Rappresenta il prototype del costruttore Symbol.

Symbols ben noti

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à:

Symbols di iterazione

Symbol.iterator
Un metodo che restituisce l'iteratore di default per un oggetto. Usato da for...of.
Symbol.asyncIterator
Un metodo che restituisce l'iteratore asincrono di default per un oggetto. Usato da for await of.

Symbols per le espressioni regolari

Symbol.match
Un metodo che effettua la corrispondenza su una stringa, usato anche per determinare se un oggetto può essere utilizzato come espressione regolare. Usato da String.prototype.match().
Symbol.replace
Un metodo che sostituisce le sottostringhe di una stringa corrispondenti. Usato da String.prototype.replace().
Symbol.search
Un metodo che restituisce l'indice all'interno di una stringa che corrisponde all'espressione regolare. Usato da String.prototype.search().
Symbol.split
Un metodo che divide una stringa all'indice corrispondente ad una espressione regolare. Usato da String.prototype.split().

Altri symbols

Symbol.hasInstance
Un metodo che determina se un oggetto costruttore riconosce un oggetto come propria istanza. Usato da instanceof.
Symbol.isConcatSpreadable
Un valore booleano indicante se un oggetto deve essere appiattito ai soui elementi array. Usato da Array.prototype.concat().
Symbol.unscopables
An object value of whose own and inherited property names are excluded from the with environment bindings of the associated object.
Symbol.species
Una funzione costruttore utilizzata per creare oggetti derivati.
Symbol.toPrimitive
Un metodo che converte un oggetto in un valore primitivo.
Symbol.toStringTag
Una stringa usata per la descizione di default di un oggetto. Usato da Object.prototype.toString().

Metodi

Symbol.for(key)
Cerca la "key" fornita tra i symbol esistenti e la restituisce nel caso in cui venga trovata. In caso contrario un nuovo symbol viene creato nel registro globale dei symbol con la "key" indicata.
Symbol.keyFor(sym)
Trova una chiave symbol condivisa dal registro globale dei symbol per il symbol fornito.

Symbol prototype

Tutti i simboli ereditano da Symbol.prototype.

Proprietà

Symbol.prototype.constructor
Returns the function that created an instance's prototype. This is the Symbol function by default.
Symbol.prototype.description
A read-only string containing the description of the symbol.

Metodi

Symbol.prototype.toSource()
Returns a string containing the source of the Symbol object. Overrides the Object.prototype.toSource() method.
Symbol.prototype.toString()
Returns a string containing the description of the Symbol. Overrides the Object.prototype.toString() method.
Symbol.prototype.valueOf()
Returns the primitive value of the Symbol object. Overrides the Object.prototype.valueOf() method.
Symbol.prototype[@@toPrimitive]
Returns the primitive value of the Symbol object.

Esempi

Using the typeof operator with symbols

L'operatore typeof può aiutare ad identificare i symbol.

typeof Symbol() === 'symbol'
typeof Symbol('foo') === 'symbol'
typeof Symbol.iterator === 'symbol'

Conversioni di tipo dei symbol

Alcune cose da notare quando si lavora con le conversioni di tipo dei symbol.

  • Quando si prova a convertire un symbol in un numero, un TypeError verrà generato
    (e.g. +sym or sym | 0).
  • Quando si usa l'uguaglianza non stretta, Object(sym) == sym restituisce true.
  • Symbol("foo") + "bar" lancia un 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.
  • La "safer" String(sym) conversion funziona come una chiamata a Symbol.prototype.toString() con symbol, ma notare che new String(sym) genererà un errore.

Symbols ed iterazione for...in

I symbol non sono enumerabili in un'iterazione for...in. In aggiunta, Object.getOwnPropertyNames() non restituirà le proprietà symbol dell'oggetto, tuttavia, si puù usare 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"
}

Symbols e JSON.stringify()

Le proprietà le cui chiavi sono symbol vengono completamente ignorate da JSON.stringify():

JSON.stringify({[Symbol('foo')]: 'foo'});                 
// '{}'

Per ulteriori dettagli, vedere JSON.stringify().

Symbol wrapper objects come chiavi per le proprietà

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

Specificazioni

Specificazione Stato Commento
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Symbol' in that specification.
Standard Initial definition
ECMAScript Latest Draft (ECMA-262)
The definition of 'Symbol' in that specification.
Draft  

Browser compatibility

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
SymbolChrome Full support 38Edge Full support 12
Notes
Full support 12
Notes
Notes Edge 12 included Symbol properties in JSON.stringify() output.
Firefox Full support 36IE No support NoOpera Full support 25Safari Full support 9WebView Android Full support 38Chrome Android Full support 38Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support 25Safari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
asyncIteratorChrome Full support 63Edge No support NoFirefox Full support 57IE No support NoOpera Full support 50Safari Full support 11.1WebView Android Full support 63Chrome Android Full support 63Edge Mobile No support NoFirefox Android No support NoOpera Android Full support 50Safari iOS No support NoSamsung Internet Android No support Nonodejs Full support 10.0.0
descriptionChrome Full support 70Edge No support NoFirefox Full support 63IE No support NoOpera Full support 57Safari No support NoWebView Android Full support 70Chrome Android Full support 70Edge Mobile No support NoFirefox Android Full support 63Opera Android Full support 57Safari iOS No support NoSamsung Internet Android No support Nonodejs No support No
forChrome Full support 40Edge Full support 12Firefox Full support 36IE No support NoOpera Full support YesSafari Full support 9WebView Android Full support 40Chrome Android Full support 40Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support YesSafari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
hasInstanceChrome Full support 50Edge Full support 15Firefox Full support 50IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 50Chrome Android Full support 50Edge Mobile Full support YesFirefox Android Full support 50Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.5.0
Full support 6.5.0
Full support 6.0.0
Disabled
Disabled From version 6.0.0: this feature is behind the --harmony runtime flag.
isConcatSpreadableChrome Full support 48Edge Full support 15Firefox Full support 48IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 48Chrome Android Full support 48Edge Mobile Full support YesFirefox Android Full support 48Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
iteratorChrome Full support 43Edge Full support 12Firefox Full support 36IE No support NoOpera Full support 30Safari Full support 10WebView Android Full support 43Chrome Android Full support 43Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support YesSafari iOS Full support 10Samsung Internet Android Full support Yesnodejs Full support 0.12
keyForChrome Full support 40Edge Full support 12Firefox Full support 36IE No support NoOpera Full support YesSafari Full support 9WebView Android Full support 40Chrome Android Full support 40Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support YesSafari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
matchChrome Full support 50Edge Full support YesFirefox Full support 40IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 50Chrome Android Full support 50Edge Mobile Full support YesFirefox Android Full support 40Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
matchAllChrome Full support 73Edge No support NoFirefox Full support 67IE No support NoOpera Full support 60Safari No support NoWebView Android Full support 73Chrome Android Full support 73Edge Mobile No support NoFirefox Android Full support 67Opera Android Full support YesSafari iOS No support NoSamsung Internet Android Full support Yesnodejs No support No
prototypeChrome Full support 38Edge Full support 12Firefox Full support 36IE No support NoOpera Full support 25Safari Full support 9WebView Android Full support 38Chrome Android Full support 38Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support 25Safari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
replaceChrome Full support 50Edge Full support YesFirefox Full support 49IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 50Chrome Android Full support 50Edge Mobile Full support YesFirefox Android Full support 49Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
searchChrome Full support 50Edge Full support YesFirefox Full support 49IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 50Chrome Android Full support 50Edge Mobile Full support YesFirefox Android Full support 49Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
speciesChrome Full support 51Edge Full support 13Firefox Full support 41IE No support NoOpera Full support 38Safari Full support 10WebView Android Full support 51Chrome Android Full support 51Edge Mobile Full support 14Firefox Android Full support 41Opera Android Full support 38Safari iOS Full support 10Samsung Internet Android Full support Yesnodejs Full support 6.5.0
Full support 6.5.0
Full support 6.0.0
Disabled
Disabled From version 6.0.0: this feature is behind the --harmony runtime flag.
splitChrome Full support 50Edge Full support YesFirefox Full support 49IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 50Chrome Android Full support 50Edge Mobile Full support YesFirefox Android Full support 49Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
toPrimitiveChrome Full support 47Edge Full support 15Firefox Full support 44IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 47Chrome Android Full support 47Edge Mobile Full support YesFirefox Android Full support 44Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
toSource
Non-standard
Chrome No support NoEdge No support NoFirefox Full support 36IE No support NoOpera No support NoSafari No support NoWebView Android No support NoChrome Android No support NoEdge Mobile No support NoFirefox Android Full support 36Opera Android No support NoSafari iOS No support NoSamsung Internet Android No support Nonodejs No support No
toStringChrome Full support 38Edge Full support 12Firefox Full support 36IE No support NoOpera Full support 25Safari Full support 9WebView Android Full support 38Chrome Android Full support 38Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support 25Safari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
toStringTagChrome Full support 49Edge Full support 15Firefox Full support 51IE No support NoOpera Full support YesSafari Full support YesWebView Android Full support 49Chrome Android Full support 49Edge Mobile Full support YesFirefox Android Full support 51Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support 6.0.0
Full support 6.0.0
Full support 4.0.0
Disabled
Disabled From version 4.0.0: this feature is behind the --harmony runtime flag.
unscopablesChrome Full support 45Edge Full support 12Firefox Full support 48IE No support NoOpera Full support YesSafari Full support 9WebView Android Full support 45Chrome Android Full support 45Edge Mobile Full support YesFirefox Android Full support 48Opera Android Full support YesSafari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support 0.12
valueOfChrome Full support 38Edge Full support 12Firefox Full support 36IE No support NoOpera Full support 25Safari Full support 9WebView Android Full support 38Chrome Android Full support 38Edge Mobile Full support YesFirefox Android Full support 36Opera Android Full support 25Safari iOS Full support 9Samsung Internet Android Full support Yesnodejs Full support Yes
@@toPrimitiveChrome ? Edge ? Firefox Full support 44IE No support NoOpera ? Safari ? WebView Android ? Chrome Android ? Edge Mobile ? Firefox Android Full support 44Opera Android ? Safari iOS ? Samsung Internet Android ? nodejs ?

Legend

Full support  
Full support
No support  
No support
Compatibility unknown  
Compatibility unknown
Non-standard. Expect poor cross-browser support.
Non-standard. Expect poor cross-browser support.
See implementation notes.
See implementation notes.
User must explicitly enable this feature.
User must explicitly enable this feature.

Vedere anche

Tag del documento e collaboratori

Hanno collaborato alla realizzazione di questa pagina: mdnwebdocs-bot, fscholz, Cerealkillerway
Ultima modifica di: mdnwebdocs-bot,