Heim >Web-Frontend >js-Tutorial >Einführung in symbolbezogenes Wissen in ES6 (Codebeispiel)
Der Inhalt dieses Artikels ist eine Einführung in das symbolbezogene Wissen in ES6 (Codebeispiele). Ich hoffe, dass er für Sie hilfreich ist.
symbol ist ein in es6 eingeführter Typ. Er gehört ebenfalls zur Kategorie der primitiven Typen (Zeichenfolge, Zahl, Boolescher Wert, Null, undefiniert, Symbol)
let name = Symbol('xiaohesong') typeof name // 'symbol' let obj = {} obj[name] = 'xhs' console.log(obj[name]) //xhs
Dieses Ding ist gemeinsam nutzbar. Wenn es erstellt wird, wird geprüft, ob das Symbol dieses Schlüssels global gefunden wird. Wenn es nicht vorhanden ist, wird es direkt zurückgegeben , wird es global erstellt und registriert.
let uid = Symbol.for("uid"); let object = { [uid]: "12345" }; console.log(object[uid]); // "12345" console.log(uid); // "Symbol(uid)" let uid2 = Symbol.for("uid"); console.log(uid === uid2); // true console.log(object[uid2]); // "12345" console.log(uid2); // "Symbol(uid)"Die hier erwähnte Freigabe ist eine globale Freigabe, ähnlich dem globalen Bereich, und wird in der gesamten Umgebung geteilt
let uid = Symbol.for("uid"); console.log(Symbol.keyFor(uid)); // "uid" let uid2 = Symbol.for("uid"); console.log(Symbol.keyFor(uid2)); // "uid" let uid3 = Symbol("uid"); console.log(Symbol.keyFor(uid3)); // undefined
Das gemeinsam genutzte Symbol uid3 existiert nicht in der globalen Registrierung. Also Der entsprechende Schlüssel kann nicht abgerufen werden.
Hier wird ein Fehler gemeldet , es wird die UID in Strings umwandeln, die hinzugefügt werden. Wenn Sie wirklich hinzufügen möchten, können Sie zuerst String (uid) und dann hinzufügen, aber derzeit scheint dies bedeutungslos zu sein.
let uid = Symbol('uid') uid + ''
es6 fügt hierfür die Methode Object.getOwnPropertySymbols hinzu.
Haben Sie das Gefühl, dass Symbole selten verwendet werden? Tatsächlich werden in es6 immer noch viele davon intern verwendet.
Jede Funktion hat diese Methode. Vielleicht sind Sie mit dieser Methode nicht sehr vertraut, aber es ist tatsächlich das, was Instanz von tut. Das ist richtig, es6 schreibt diese Methode für Sie neu.
let uid = Symbol('uid') let obj = { [uid]: 'uid' } console.log(Object.keys(obj)) // [] console.log(Object.getOwnPropertyNames(obj)) // [] console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(uid)]
Eigentlich erledigt es6 das für Sie
function Xiao(){} const xiao = new Xiao xiao instanceof Xiao // true
Dies ist eine interne Methode und unterstützt kein Umschreiben. Natürlich können wir es auf dem Prototyp umschreiben.
Xiao[Symbol.hasInstance](xiao)
Sie können feststellen, dass wir es umschreiben, um zurückzugeben, ob der entsprechende Wert ein boolescher Typ ist.
Dies unterscheidet sich von anderen Eigenschaften dadurch, dass es bei einigen Standardobjekten standardmäßig nicht vorhanden ist. Verwenden Sie einfach
Object.definePrototype(Xiao, Symbol.hasInstance, { value: (v) : Boolean(v) }) const x = new Xiao x instanceof Xiao //true 0 instanceof Xiao //false 1 instanceof Xiao //true
, was nützlicher ist. Bei der Typkonvertierung versucht das Objekt, über toPrimitive
in den ursprünglichen Typ zu konvertieren Typen existieren auf Prototypen. Wenn
eine Typkonvertierung durchführt, wird toPrimitive
gezwungen, einen Parameter aufzurufen. In der Spezifikation heißt dieser Parameter hint
. Dieser Parameter hat drei Werte („Zahl“, „Zeichenfolge“, „Standard“). ) einer von ihnen.
Wie der Name schon sagt, gibt string
string
zurück, number
gibt number
zurück und der Standardwert ist nicht angegeben, der Standardwert.
Was ist also die Standardsituation? In den meisten Fällen ist der numerische Modus die Standardeinstellung. (Mit Ausnahme des Datums wird der Standardstatus als Zeichenfolgenmodus betrachtet.)
Tatsächlich gibt es während der Typkonvertierung nicht viele Aufrufe des Standardstatus. Zum Beispiel (==
, +
) oder beim Übergeben von Parametern an die Konstruktionsparameter von Date
.
Das Verhalten des Zahlenmodus im numerischen Fall (Priorität von hoch nach niedrig)
Erster Aufruf von valueOf, wenn es sich um einen primitiven Typ handelt , Dann zurück.
Wenn der vorherige Wert kein primitiver Wert ist, versuchen Sie, toString aufzurufen. Wenn es sich um einen primitiven Wert handelt, geben Sie
If zurück keines davon existiert, dann einfach einen Fehler melden
String-Modus Bei Strings ist das Verhalten etwas anders (Priorität von hoch nach niedrig)
Zuerst toString aufrufen, wenn es ein primitiver Wert ist, dann zurückgeben
Wenn der vorherige Wert kein primitiver Wert ist, dann versuchen Sie, valueOf aufzurufen, wenn es ein primitiver Wert ist, dann zurück
Wirft einen Fehler aus
Nun, es fühlt sich etwas verwirrend an, ja, lassen Sie mich den Code erklären.
let objs = {0: 'first', 1: 'second', length: 2, [Symbol.isConcatSpreadable]: true} ['arrs'].concat(objs) //["arrs", "first", "second"]
Anhand der obigen Ausgabe können Sie feststellen, dass valueOf in den meisten Fällen zuerst aufgerufen wird.
Einschließlich des Standardfalls ist der Standardwert der aufgerufene Zahlenmodus, und die meisten davon sind der aufgerufene Zahlenmodus. Sie können feststellen, dass toString der Modus ist, der String aufruft. Sie können also davon ausgehen, dass es sich grundsätzlich um einen numerischen Modus handelt, es sei denn, es handelt sich um einen Zeichenfolgenmodus.
Nicht ganz klar über diesen Anrufmodus? Es ist in Ordnung, es6 macht diese interne Methode der Außenwelt zugänglich, wir können sie umschreiben und den Typ des Hinweises ausgeben. Kommen Sie zu
let obj = { valueOf: function(){console.log('valueOf')}, toString: function(){console.log('toString')} } // console.log value is obj + 2 //valueOf obj == 2 // valueOf Number(obj) // valueOf String(obj) // toString
der oben genannten Art, Sie können es ausprobieren.
Das obige ist der detaillierte Inhalt vonEinführung in symbolbezogenes Wissen in ES6 (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!