Heim > Web-Frontend > js-Tutorial > Deep Learning zur Konvertierung von JavaScript-Typen

Deep Learning zur Konvertierung von JavaScript-Typen

高洛峰
Freigeben: 2016-11-04 09:32:11
Original
1007 Leute haben es durchsucht

JavaScript ist eine schwach typisierte Sprache. Wenn Sie zum ersten Mal damit in Kontakt kommen, werden Sie feststellen, dass sie bequem und schnell ist (keine Notwendigkeit, Variablentypen zu deklarieren!). Die Probleme, die es mit sich bringt, sind manchmal unerwartet

Hahahahaha, das ist nicht so übertrieben. Vielleicht hat jemand so einen Code gesehen

[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
Nach dem Login kopieren

Das nimmt viel Platz und 3167 Zeichen ein. Fügen Sie es in die Konsole des Browsers ein und es wird direkt angezeigt. Sind Sie auf Abruf verfügbar?

Für diejenigen, die die Quelle des Prinzips nicht kennen, finden Sie hier eine Adresse: http://www .jsfuck.com/

Die Perversion von JSFuck hat das extreme Niveau erreicht, denn ihr Konzept lautet: Schreiben Sie ein beliebiges JavaScript mit 6 Zeichen: []()>Manche Leute sagen vielleicht: Das ist einfach lustig , wer schreibt eigentlich Code wie diesen?

Das ist richtig, wenn ein Codeabschnitt undurchsichtig und schwer verständlich wird, können selbst die oben erwähnten verwirrenden Zeichen (himmlisches Buch) jede Funktion erfüllen, die unvorhersehbar wird, was bedeutet dass die Sicherheit von JS-Code nicht gewährleistet ist

Natürlich wird in diesem Artikel nicht untersucht, wie diese bedeutungslosen Zeichenprinzipien implementiert werden, da die Github-Dokumentation sehr umfassend ist. Wenn Sie interessiert sind, können Sie sie lesen: https ://github.com/aemkei/jsfuck

Lassen Sie uns darüber sprechen, wie die zugrunde liegenden Methoden, die wir jeden Tag verwenden, analysiert werden. Wir alle wissen, dass Konvertierungen in zwei Typen unterteilt sind: die eine implizite Konvertierung und die andere ist eine erzwungene Typkonvertierung

Implizite Konvertierung

In den folgenden Situationen konvertiert JavaScript automatisch Datentypen:

Verschiedene Datentypen führen gegenseitige Operationen aus

Berechnen Sie boolesche Werte für nicht-boolesche Datentypen.

Verwenden Sie unäre Operatoren (d. h. „ “ und „-“) für nicht-numerische Datentypen.

Implizite Konvertierung in boolesche Werte.

Wird meistens verwendet, wenn Urteile gefällt werden. Hier müssen Sie sich nur daran erinnern, dass sechs in falsch umgewandelt werden und alle anderen wahr sind

null

undefiniert

NaN

''

-0

0

implizite Konvertierung in String

Automatische Konvertierung von Strings, erfolgt hauptsächlich bei Additionsoperationen. Wenn ein Wert eine Zeichenfolge und der andere Wert keine Zeichenfolge ist, wird letzterer in eine Zeichenfolge umgewandelt.

Implizite Konvertierung in eine Zahl
'1' + 2  // '12' 
'1' + true  // "1true" 
'1' + false  // "1false" 
'1' + {}  // "1[object Object]" 
'1' + []  // "1" 
'1' + function (){}  // "1function (){}" 
'1' + undefined  // "1undefined" 
'1' + null  // "1null"
Nach dem Login kopieren

Mit Ausnahme des Additionsoperators, der den Operator möglicherweise in eine Zeichenfolge umwandelt, wandeln andere Operatoren die Operatoren auf beiden Seiten automatisch in Zahlen um

Die grundlegenden Leistungen der impliziten Konvertierung werden hier hervorgehoben. Es wird betont, dass diese Konvertierungen mit einer erzwungenen Konvertierung unter Verwendung von Booleschen Werten, Zahlen und Zeichenfolgen einhergehen. Konzentrieren wir uns auf das Prinzip der erzwungenen Konvertierung
'5' - '2'  // 3 
'5' * '2'  // 10 
true - 1  // 0 
false - 1  // -1 
'1' - 1  // 0 
'5' * []  // 0 
false / '5'  // 0 
'abc' - 1  // NaN 
+'abc'  // NaN 
-'abc'  // NaN 
+true  // 1 
-false  // 0
Nach dem Login kopieren

Zwangskonvertierung

Nachdem Sie das obige Beispiel gesehen haben, haben Sie möglicherweise einige Fragen: Warum gibt die obige „1“ {} 1[Objektobjekt] aus?

Wie oben betont: Ja, das würden Sie vermuten Führen Sie zuerst String({}) aus, um „[object Object]“ zu erhalten, und verketten Sie dann die Zeichenfolgen. Ja, wir können immer das Implementierungsprinzip hinter der Konvertierung erhalten. Tatsächlich ist das eigentliche Prinzip komplizierter, siehe unten 🎜 >

Erzwungene Konvertierung in Boolean

Ich überspringe es hier, da es dasselbe ist wie eine implizite Konvertierung. Denken Sie daran, dass [] und {} in true konvertiert werden

Zwangskonvertierung in String

Die Konvertierungsergebnisse von Basistypen sind die gleichen wie bei impliziten Konvertierungen, um die Analyse der oben genannten Beispiele zu vertiefen

Die Konvertierung von Objekten in Zeichenfolgen ist in drei Schritte unterteilt

Rufen Sie zuerst die toString-Methode auf. Wenn die toString-Methode einen Wert des ursprünglichen Typs zurückgibt, verwenden Sie die String-Methode für den Wert und fahren Sie nicht mit den folgenden Schritten fort

Wenn die toString-Methode einen zurückgibt Wert eines zusammengesetzten Typs, dann rufen Sie die valueOf-Methode auf. Wenn der Wert des ursprünglichen Typs ein Wert eines primitiven Typs ist, verwenden Sie die String-Methode für den Wert und führen Sie die folgenden Schritte nicht mehr aus

Wenn die valueOf-Methode einen Wert eines zusammengesetzten Typs zurückgibt, wird ein Fehler gemeldet

Lassen Sie uns dieses Beispiel noch einmal aufschlüsseln

Der obige Code entspricht dem folgenden

String({}) 
// "[object Object]"
Nach dem Login kopieren

Wenn die toString-Methode und die valueOf-Methode einen Wert zurückgeben, der kein primitiver Typ ist, meldet die String-Methode einen Fehler

String({}.toString()) 
// "[object Object]"
Nach dem Login kopieren

Es ist nicht schwer zu erkennen, dass wir umschreiben können die toString-Methode und die valueOf-Methode, und es ist viel einfacher, die Reihenfolge zu testen, in der sie ausgeführt werden

var obj = { 
  valueOf: function () { 
    console.log("valueOf"); 
    return {}; 
  }, 
  toString: function () { 
    console.log("toString"); 
    return {}; 
  } 
}; 
 
String(obj) 
// TypeError: Cannot convert object to primitive value
Nach dem Login kopieren

Das Ergebnis zeigt, dass die toString-Methode vor der valueOf-Methode

<🎜 ausgeführt wird > erzwungene Konvertierung Die grundlegende Typkonvertierung für Number
String({toString:function(){return 3;}}) 
// "3" 
 
String({valueOf:function (){return 2;}}) 
// "[object Object]" 
 
String({valueOf:function (){return 2;},toString:function(){return 3;}}) 
// "3"
Nach dem Login kopieren

ist wie folgt: Die

-Objektkonvertierung ist ebenfalls komplizierter. Der einzige Unterschied zur String besteht darin, dass die valueOf-Methode an erster Stelle steht und toString Weitere Details finden Sie im obigen Beispiel.

isNaN() ist kein Unbekannter, der interne Konvertierungsprozess von isNaN({}) //true ist derselbe
Number("123") // 123 
 
Number("123abc") // NaN 
 
Number("") // 0 
 
Number(false) // 0 
 
Number(undefined) // NaN 
 
Number(null) // 0
Nach dem Login kopieren

Zusammenfassung

Es gibt viele andere Konvertierungsprinzipien, siehe An dieser Stelle können wir den Codekonvertierungsprozess am Anfang des Artikels noch nicht erläutern. Dies dient eher dazu, das normale Schreiben von Code sicherzustellen und Fehler zu vermeiden. Wenn Sie sehr neugierig sind, können Sie sich dort mit den spezielleren Konvertierungsprinzipien befassen sind noch viele mehr.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage