Sah das in meinem Newsletter. Getestet auf Chrome und Firefox. Ich kann es immer noch nicht herausfinden.JavaScript: Warum [] + (- ~ {} - ~ {} - ~ {} - ~ {}) + (- ~ {} - ~ {}); gibt "42" zurück
[]+(-~{}-~{}-~{}-~{})+(-~{}-~{}); //=> "42"
Sah das in meinem Newsletter. Getestet auf Chrome und Firefox. Ich kann es immer noch nicht herausfinden.JavaScript: Warum [] + (- ~ {} - ~ {} - ~ {} - ~ {}) + (- ~ {} - ~ {}); gibt "42" zurück
[]+(-~{}-~{}-~{}-~{})+(-~{}-~{}); //=> "42"
Auswertung:
~{}
ausgewertet wird, um die interne Funktion:
~ToInt32({})
die gibt -1.
Ref ECMA-Spezifikation - http://www.ecma-international.org/ecma-262/5.1/#sec-9.5 und diese Erklärung - http://jibbering.com/faq/notes/type-conversion/#tcToInt32
Daher wird in diesem Fall
(-~{}-~{}) == 2
(-~{}-~{}-~{}-~{}) == 4
Wie Sie []+
in Beginn Ausdruck haben, verwenden Javascript und Operanden wie String. So haben Sie "" + "4" + "2" = "42"
Sie waren ungefähr 20 Sekunden schneller als ich. :) – xxbbcc
'~' ist der Bitwise NOT-Operator. Es konvertiert '0' in' -1' – laggingreflex
'{}! = Undefined' (Fühlen Sie sich frei, dies zu testen). – Amit
Der Operator ~
ist ein Bitweiser NOT-Operator. Es gibt das "1-Komplement" einer Zahl zurück. Aus diesem Grund wird {}
in eine Zahl umgewandelt, was zu NaN
führt. Das gleiche würde mit +{} == NaN
passieren. Die bitweise nicht von ~NaN == -1
. Also:
(-~{}-~{}-~{}-~{}) == 4
& (-~{}-~{}) == 2
Die Default für ein leeres Array ist ein leerer String. Zum Beispiel []==[]+[] && []+[]==''
Von dass die vollständige Analyse ist: []+ /*converted to ''+*/ (-~{}-~{}-~{}-~{}) /*Equals numeric 4, but concatenated as a string to become '4'*/ + (-~{}-~{}) /*Equals numeric 2, but concatenated as a string to become '2'*/
und das Endergebnis tatsächlich '42'
.
Sie können diese typeof([]+(-~{}-~{}-~{}-~{})+(-~{}-~{})) === 'string'
noch nie gesehen etwas über validieren, werde ich zu wissen, interressiert werden, was das ist. –
Weil Javascript lächerliche numerische Zwangsregeln hat. (Und es ist im Wesentlichen unmöglich, nach früheren Instanzen zu suchen, in denen diese Frage gestellt wurde.) –
Wenn Sie sich fragen, warum JS bestimmte Dinge so macht, wie ich es tue, ermutige ich Sie, die Spezifikation zu lesen. Sie müssen nur auf http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.8, http://www.ecma-international.org/ecma-262/5.1/# schauen. sec-11.4.7 und http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1 –