Dieser Artikel bietet Ihnen eine detaillierte Analyse der JavaScript-Operatorpriorität (mit Beispielen). Ich hoffe, dass er Ihnen weiterhilft.
Nachdem ich seit zwei Jahren JavaScript schreibe, dachte ich, ich würde nicht in die Syntaxfalle tappen, aber tatsächlich wurde ich kürzlich von einem gutaussehenden Mann im Produktentwicklungsteam um ein Gespräch gebeten Ein Problem. Um das Lesen für alle zu erleichtern, habe ich das Modell dieses Problems abstrahiert:
var provider = { test: { $get: function(){ return function anonymous(config){ }; } } }; var type = "test"; var config = {}; new provider[type].$get()(config);
Wenn die obige Anweisung ausgeführt wird, warum funktioniert das anonymous
in der Funktion this
zeigen Sie auf window
statt auf new
und erstellen Sie ein neues Objekt. Das erste, was ich dachte, als ich diese Frage hörte, war: Nani! Wie ist es möglich, dass das new
im Konstruktor, der dem this
-Operator entspricht, nicht auf eine neu erstellte Objektinstanz verweist? Da ich das Problem damals nicht sorgfältig vom Geschäft abstrahierte, war ich tatsächlich etwas verwirrt. Aber als ich sorgfältig darüber nachdachte, was genau drückte dieser Satz aus?
Denken
Bevor wir über die Bedeutung dieses Ausdrucks sprechen, wollen wir über ein paar kleine Kenntnisse über den neuen Operator sprechen:
Konstruktor-Return
Der JavaScript-Konstruktor kann einen Wert zurückgeben oder nicht, wie zum Beispiel:
function Person(){ } var person = new Person()
Wir wissen, dass der Konstruktor zu diesem Zeitpunkt die erstellte Instanz zurückgibt Objekt, das heißt, das Objekt, auf das gezeigt wird this
im Konstruktor. Wenn Ihr Konstruktor jedoch einen Rückgabewert hat, müssen Sie je nach Situation differenzieren. Wenn ein Wert zurückgegeben wird, der kein Referenztyp ist, handelt es sich tatsächlich um ein neu erstelltes Instanzobjekt. Wenn jedoch ein Wert eines Referenztyps zurückgegeben wird, wird das Referenzobjekt selbst zurückgegeben. Zum Beispiel:
function Person(){ return function(){} } var person = new Person() typeof person // "function"
In JavaScript sind Funktionen als Bürger erster Klasse im Wesentlichen Referenztypen, daher ist person die zurückgegebene anonyme Funktion.
Zwei Formen neuer Operatoren
Tatsächlich lautet die Syntax in der Beschreibung des neuen Operators von MDN
new constructor[([arguments])]
Sie finden ([Argumente]) Wenn es also keinen Unterschied zwischen new Person() und new Person für einen Konstruktor ohne Parameter gibt, denken wir über eine Frage nach Funktion: Wenn new Person() ausgeführt wird, warum wird dann new Person() anstelle von (new Person)() ausgeführt? Wenn Sie einen meiner vorherigen Artikel gelesen haben, wissen Sie, dass der neue Operator mit Parametern eine höhere Priorität hat als der neue Operator ohne Parameterliste. Daher wird immer der erste anstelle des zweiten ausgeführt.
Nachdem wir die obigen Schritte verstanden haben, sind wir dem Kern des Problems nahe. Wie analysiert die JavaScript-Engine den Ausdruck
new provider[type].$get()(config);
(new provider[type].$get())(config);
new (provider[type].$get())(config);
var str = "Hello" + true ? "World" : "JavaScript";
Da der +-Operator eine höhere Priorität hat als der bedingte Operator, erleichtert das Hinzufügen von Klammern zu diesem Zeitpunkt die Lesbarkeit Ihres Codes. Zweitens: Bleiben Sie voller Ehrfurcht vor der Technologie. Die größte Angst ist, dass Sie denken, Sie wüssten alles, aber in Wirklichkeit wissen Sie nichts.
Das obige ist der detaillierte Inhalt vonDetaillierte Analyse der Priorität von JavaScript-Operatoren (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!