Heim >Web-Frontend >js-Tutorial >Deep Learning zur Konvertierung von JavaScript-Typen
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
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()
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"
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
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 BooleanIch überspringe es hier, da es dasselbe ist wie eine implizite Konvertierung. Denken Sie daran, dass [] und {} in true konvertiert werdenZwangskonvertierung 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]"
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]"
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
Das Ergebnis zeigt, dass die toString-Methode vor der valueOf-Methode
erzwungene Konvertierung Die grundlegende Typkonvertierung für NumberString({toString:function(){return 3;}}) // "3" String({valueOf:function (){return 2;}}) // "[object Object]" String({valueOf:function (){return 2;},toString:function(){return 3;}}) // "3"
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 derselbeNumber("123") // 123 Number("123abc") // NaN Number("") // 0 Number(false) // 0 Number(undefined) // NaN Number(null) // 0
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.