2017-09-15 3 views
0

Wie ist der Alarm (++ [[]] [+ []] + [+ []]); berechnet zu 0? Wie heißt dieser Prozess, damit ich mehr darüber lesen kannWie ist der Alarm (++ [[]] [+ []] + [+ []]); berechnet zu 0?

+0

Was versuchen Sie zu tun? erklären Sie mehr – Bhargav

+0

tatsächlich in jfiddle ist es 10! : 0 @Bhargav ... Ich denke es ist nur aus Neugier ... Ich würde gerne wissen, warum JS hier überhaupt etwas berechnet – CodeHacker

+3

Siehe [JSFUCK] (https://en.wikipedia.org/wiki/JSFuck) –

Antwort

4

Der Ausdruck wird tatsächlich die Zeichenfolge '10' zurückgeben. Lassen Sie uns es brechen:

Schritt 1: +[]

Dies ist ein unäres Plus Operator wörtliche durch ein leeres Array gefolgt. Das unäre Plus versucht, den folgenden Wert in eine Ganzzahl zu konvertieren. In diesem Fall ist der Wert ein Array:

+[]; // 0 

// This is identical: 
Number([]); // 0 

Der zurückgegebene Wert entspricht [].toString() Aufruf und dann dassNumber() Ergebnis zu geben. [].toString() gibt eine leere Zeichenfolge ('') zurück und Number('') gibt 0 zurück.

Array.prototype.toString

Das Array-Objekt überschreibt die toString Verfahren zum Objekt. Bei Array-Objekten verbindet die toString-Methode das Array und gibt eine Zeichenfolge zurück, die jedes Array-Element durch Kommas getrennt enthält.

Number.

In einem nicht-Konstruktor Kontext (das heißt, ohne den new Operator), Number kann eine Typumwandlung durchzuführen verwendet werden.

Wenn wir also Vorkommen von +[]-0 in der Quelle zu ändern, bekommen wir:

++[[]][0] + [0] 

Schritt 2: [[]][0]

Dieser Schritt ist ein einfaches Bedienelement Zugriff Array: Ein Array mit einem verschachtelten (leeren) Array wird zuerst definiert, und dann wird auf dieses erste verschachtelte Array mit [0] zugegriffen, das einfach [] zurückgibt. Also, wenn wir diesen Teil des Ausdrucks ersetzen, erhalten wir:

++[] + [0] 

Schritt 3: ++[]

Die ++ <value> Betreiber ersten versucht <value> in eine Zahl zu konvertieren, und erhöht dann die Zahl 1. Das Verfahren zum Konvertieren des Arrays in eine Zahl in diesem Beispiel erfolgt genauso wie +[] in Schritt 1: [] wird zuerst in eine Zeichenfolge konvertiert ('' in diesem Fall, da das Array leer ist) und dann in konvertiert eine Nummer, die wieder retu rns 0. Zuletzt wird 0 um 1 inkrementiert, was 1 zurückgibt.Also, wenn wir diesen Teil des Ausdrucks ersetzen, erhalten wir:

1 + [0] 

Schritt 4: 1 + [0]

Dies ist der seltsame Teil der Geschichte ist. Sie würden erwarten, dass dies bei den gegebenen Informationen die Ganzzahl 1 ergibt, aber tatsächlich wird es zu einer Zeichenkette '10' ausgewertet. Dies liegt an den zwei Schritten im obigen Beispiel für die Typumwandlungen von Arrays (zuerst in Zeichenfolge, dann in Nummer). Diese zwei Schritte waren erforderlich, da die Arrays immer Operanden arithmetischer Operatoren waren (d. H. Mathematische Berechnungen). Der Operator + kann jedoch sowohl als Arithmetik + Operator oder String-Verkettung Operator dienen, und Letzteres hat immer Vorrang.

So sobald [0] in einen String umgewandelt wird, die beide an den + Operator gegebenen Operanden wird in einen String umgewandelt werden, da ein Operand bereits eine Zeichenfolge ist. Wenn wir nun den Ausdruck durch konvertierte Operanden ersetzen, erhalten wir den letzten Schritt bei der Auswertung des Ausdrucks:

+0

@ Jeffrey Westerkamp gibt es keinen Vorrang für das, ich meine im Allgemeinen, nicht nur für diesen Code –

+0

Wenn du meinst _should ich dieses in irgendeiner verwenden meiner Projekte_, ist die Antwort definitiv nein. Diese Snippets sollten als Puzzles betrachtet werden, um Ihnen zu helfen, die Macken von JS zu verstehen. Meine Meinung: niemals, niemals diese Art von "Magie" in realen Szenarien. –

+0

In Ordnung. Vielen Dank –

Verwandte Themen