Heim >Web-Frontend >js-Tutorial >Einführung in symbolbezogenes Wissen in ES6 (Codebeispiel)

Einführung in symbolbezogenes Wissen in ES6 (Codebeispiel)

不言
不言nach vorne
2018-11-26 15:59:572219Durchsuche

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)

basic

let name = Symbol('xiaohesong')
typeof name // 'symbol'
let obj = {}
obj[name] = 'xhs'
console.log(obj[name]) //xhs

Symbol für

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

Symbolschlüssel für

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.

Symbol kann nicht zum Konvertieren erzwungen werden

rrree

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.

Den Symbolschlüssel in obj abrufen

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.

Symbol.hasInstance

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.

Symbol.isConcatSpreadable

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

Symbol.toPrimitive

, 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen