2015-06-11 15 views
6

Sah das in meinem Newsletter. Getestet auf Chrome und Firefox. Ich kann es immer noch nicht herausfinden.JavaScript: Warum [] + (- ~ {} - ~ {} - ~ {} - ~ {}) + (- ~ {} - ~ {}); gibt "42" zurück

[]+(-~{}-~{}-~{}-~{})+(-~{}-~{}); //=> "42" 
+0

noch nie gesehen etwas über validieren, werde ich zu wissen, interressiert werden, was das ist. –

+1

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.) –

+0

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 –

Antwort

6

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"

+0

Sie waren ungefähr 20 Sekunden schneller als ich. :) – xxbbcc

+1

'~' ist der Bitwise NOT-Operator. Es konvertiert '0' in' -1' – laggingreflex

+1

'{}! = Undefined' (Fühlen Sie sich frei, dies zu testen). – Amit

3

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'

Verwandte Themen