variable - javascript... operator




Warum gibt++[[]][+[]]+[+[]] die Zeichenfolge "10" zurück? (6)

  1. Unary plus angegebene Zeichenfolge wird in Zahl konvertiert
  2. Increment Operator angegebene Zeichenfolge konvertiert und erhöht sich um 1
  3. [] == ''. Leerer String
  4. + '' oder + [] wertet 0 aus.

    ++[[]][+[]]+[+[]] = 10 
    ++[''][0] + [0] : First part is gives zeroth element of the array which is empty string 
    1+0 
    10
    

Dies ist gültig und gibt die Zeichenfolge "10" in JavaScript zurück ( weitere Beispiele hier ):

++[[]][+[]]+[+[]]

Warum? Was passiert hier?


+ [] ergibt 0 [...] dann Summierung (+ Operation) mit allem, was Array-Inhalt in seine String-Darstellung konvertiert, die aus Elementen besteht, die mit Komma verbunden sind.

Alles andere, wie den Array-Index zu nehmen (hat eine höhere Priorität als + Operation), ist ordinal und ist nichts Interessantes.


Dieser bewertet dasselbe, aber ein bisschen kleiner

+!![]+''+(+[])
  • [] - wird ein Array konvertiert, das beim Hinzufügen oder Subtrahieren in 0 konvertiert wird, also also + [] = 0
  • ! [] - ergibt false, daher wird !! [] als wahr ausgewertet
  • + !! [] - konvertiert den Wert true in einen numerischen Wert, der als true ausgewertet wird, also in diesem Fall 1
  • + '' - Fügt dem Ausdruck eine leere Zeichenfolge hinzu, die bewirkt, dass die Zahl in eine Zeichenfolge konvertiert wird
  • + [] - ergibt 0

so wird bewertet

+(true) + '' + (0)
1 + '' + 0
"10"

So, jetzt hast du das, probier dieses hier aus:

_=$=+[],++_+''+$

Lass es uns einfach machen:

++[[]][+[]]+[+[]] = "10"

var a = [[]][+[]];
var b = [+[]];

// so a == [] and b == [0]

++a;

// then a == 1 and b is still that array [0]
// when you sum the var a and an array, it will sum b as a string just like that:

1 + "0" = "10"

Wenn wir es aufteilen, ist das Chaos gleich:

++[[]][+[]]
+
[+[]]

In JavaScript ist es richtig, dass +[] === 0 . + wandelt etwas in eine Zahl um und in diesem Fall wird es auf +"" oder 0 (siehe Spezifikationen unten).

Daher können wir es vereinfachen ( ++ hat Vorrang vor + ):

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

Da [[]][0] bedeutet: Holen Sie sich das erste Element von [[]] , gilt Folgendes:

  • [[]][0] gibt das innere Array ( [] ) zurück. Aufgrund von Verweisen ist es falsch, [[]][0] === [] zu sagen, aber nennen wir das innere Array A , um die falsche Notation zu vermeiden.
  • ++[[]][0] == A + 1 , da ++ "um Eins ++ bedeutet.
  • ++[[]][0] === +(A + 1) ; mit anderen Worten, es wird immer eine Zahl sein ( +1 gibt nicht unbedingt eine Zahl zurück, während ++ immer das tut - dank Tim Down, um dies hervorzuheben).

Wiederum können wir das Chaos in etwas besser lesbares vereinfachen. Lassen Sie [] für A ersetzen:

+([] + 1)
+
[0]

In JavaScript gilt das auch: [] + 1 === "1" , weil [] == "" (ein leeres Array verbindet), also:

  • +([] + 1) === +("" + 1) , und
  • +("" + 1) === +("1") , und
  • +("1") === 1

Lass es uns noch einfacher machen:

1
+
[0]

Dies gilt auch für JavaScript: [0] == "0" , weil es ein Array mit einem Element verbindet. Joining verkettet die Elemente, getrennt durch,. Mit einem Element können Sie folgern, dass diese Logik zum ersten Element selbst führt.

Also, am Ende erhalten wir (Zahl + String = String):

1
+
"0"

=== "10" // Yay!

Spezifikationsdetails für +[] :

Das ist ein Labyrinth, aber um +[] , wird es zuerst in eine Zeichenkette umgewandelt, denn das sagt + :

11.4.6 Unärer + Operator

Der unary + -Operator konvertiert seinen Operanden in den Zahlentyp.

Die Produktion UnaryExpression: + UnaryExpression wird wie folgt ausgewertet:

  1. Sei expr das Ergebnis der Evaluierung von UnaryExpression.

  2. Return ToNumber (GetValue (Ausdruck)).

ToNumber() sagt:

Objekt

Übernehmen Sie die folgenden Schritte:

  1. Sei primValue ToPrimitive (Eingabeargument, Hinweiszeichenfolge).

  2. Zurück zu String (primValue).

ToPrimitive() sagt:

Objekt

Gibt einen Standardwert für das Objekt zurück. Der Standardwert eines Objekts wird abgerufen, indem die interne Methode [[DefaultValue]] des Objekts aufgerufen und der optionale Hinweis PreferredType übergeben wird. Das Verhalten der internen Methode [[DefaultValue]] ist in dieser Spezifikation für alle nativen ECMAScript-Objekte in 8.12.8 definiert.

[[DefaultValue]] sagt:

8.12.8 [[DefaultValue]] (Hinweis)

Wenn die interne Methode [[DefaultValue]] von O mit dem Hinweis String aufgerufen wird, werden die folgenden Schritte ausgeführt:

  1. Sei toString das Ergebnis des Aufrufs der internen Methode [[Get]] des Objekts O mit dem Argument "toString".

  2. Wenn IsCallable (toString) wahr ist,

ein. Sei str das Ergebnis des Aufrufs der internen [[Call]] - Methode von toString, wobei O der this-Wert und eine leere Argumentliste ist.

b. Wenn str ein primitiver Wert ist, gebe str zurück.

Die .toString eines Arrays sagt:

15.4.4.2 Array.prototype.toString ()

Wenn die toString-Methode aufgerufen wird, werden die folgenden Schritte ausgeführt:

  1. Lassen Sie Array das Ergebnis des Aufrufs von ToObject auf diesem Wert sein.

  2. Lassen Sie Func das Ergebnis des Aufrufs der internen Methode [[Get]] von Array mit Argument "Join" sein.

  3. Wenn IsCallable (func) false ist, sollte func die integrierte Standardmethode Object.prototype.toString (15.2.4.2) sein.

  4. Gibt das Ergebnis des Aufrufs der internen [[Call]] - Methode von func zurück, wobei array als dieser Wert und eine Liste leerer Argumente bereitgestellt wird.

Also +[] kommt auf +"" , weil [].join() === "" .

Auch hier ist das + folgt definiert:

11.4.6 Unärer + Operator

Der unary + -Operator konvertiert seinen Operanden in den Zahlentyp.

Die Produktion UnaryExpression: + UnaryExpression wird wie folgt ausgewertet:

  1. Sei expr das Ergebnis der Evaluierung von UnaryExpression.

  2. Return ToNumber (GetValue (Ausdruck)).

ToNumber ist definiert für "" als:

Der MV von StringNumericLiteral ::: [leer] ist 0.

Also +"" === 0 und somit +[] === 0 .


++[[]][+[]] => 1 // [+[]] = [0], ++0 = 1
[+[]] => [0]

Dann haben wir eine String-Verkettung

1+[0].toString() = 10




syntax