Ich habe das kürzlich 2 == [2]
in JavaScript entdeckt. Wie sich herausstellt, hat diese Eigenart einige interessante Konsequenzen:
var a = [0, 1, 2, 3];
a[[2]] === a[2]; // this is true
Ebenso funktioniert folgendes:
var a = { "abc" : 1 };
a[["abc"]] === a["abc"]; // this is also true
Noch seltsamer, das funktioniert auch:
[[[[[[[2]]]]]]] == 2; // this is true too! WTF?
Diese Verhaltensweisen scheinen in allen Browsern konsistent zu sein.
Irgendeine Idee, warum dies eine Sprachfunktion ist?
Hier sind weitere verrückte Konsequenzen dieser "Funktion":
[0] == false // true
if ([0]) { /* executes */ } // [0] is both true and false!
var a = [0];
a == a // true
a == !a // also true, WTF?
Diese Beispiele wurden von jimbojw http://jimbojw.com Fame sowie walkingeyerobot gefunden .
quelle
+"2"
ist auch die Nummer 2.Auf der rechten Seite der Gleichung haben wir das a [2], das einen Zahlentyp mit dem Wert 2 zurückgibt. Auf der linken Seite erstellen wir zuerst ein neues Array mit einem einzelnen Objekt von 2. Dann rufen wir ein [( Array ist hier drin)]. Ich bin nicht sicher, ob dies zu einer Zeichenfolge oder einer Zahl führt. 2 oder "2". Nehmen wir zuerst den String-Fall. Ich glaube, eine ["2"] würde eine neue Variable erstellen und null zurückgeben. null! == 2. Nehmen wir also an, es wird tatsächlich implizit in eine Zahl konvertiert. a [2] würde 2 zurückgeben. 2 und 2 stimmen in Typ (also === funktioniert) und Wert überein. Ich denke, es konvertiert implizit das Array in eine Zahl, weil ein [Wert] eine Zeichenfolge oder Zahl erwartet. Es sieht so aus, als hätte die Zahl einen höheren Vorrang.
Nebenbei frage ich mich, wer diesen Vorrang bestimmt. Liegt es daran, dass [2] eine Nummer als erstes Element hat und daher in eine Nummer konvertiert wird? Oder ist es so, dass beim Übergeben eines Arrays an ein [Array] versucht wird, das Array zuerst in eine Zahl und dann in eine Zeichenfolge umzuwandeln? Wer weiß?
In diesem Beispiel erstellen Sie ein Objekt namens a mit einem Element namens abc. Die rechte Seite der Gleichung ist ziemlich einfach; es ist äquivalent zu a.abc. Dies gibt 1 zurück. Die linke Seite erstellt zuerst ein Literal-Array von ["abc"]. Anschließend suchen Sie nach einer Variablen für ein Objekt, indem Sie das neu erstellte Array übergeben. Da dies eine Zeichenfolge erwartet, wird das Array in eine Zeichenfolge konvertiert. Dies ergibt nun ein ["abc"], das gleich 1 ist. 1 und 1 sind vom gleichen Typ (weshalb === funktioniert) und gleichwertig.
Dies ist nur eine implizite Konvertierung. === würde in dieser Situation nicht funktionieren, da eine Typinkongruenz vorliegt.
quelle
==
giltToPrimitive()
für das Array, das wiederum seinetoString()
Methode aufruft. Sie vergleichen also tatsächlich die Zahl2
mit der Zeichenfolge"2"
. Der Vergleich zwischen einer Zeichenfolge und einer Zahl erfolgt durch Konvertieren der ZeichenfolgeAus
==
diesem Grund empfiehlt Doug Crockford , immer zu verwenden===
. Es wird keine implizite Typkonvertierung durchgeführt.In den Beispielen mit
===
wird die implizite Typkonvertierung durchgeführt, bevor der Gleichheitsoperator aufgerufen wird.quelle
Das ist interessant, es ist nicht so, dass [0] tatsächlich sowohl wahr als auch falsch ist
Es ist Javascript's lustige Art, if () Operator zu verarbeiten.
quelle
==
funktioniert es auf lustige Weise . Wenn Sie eine tatsächliche explizite Besetzung (dhBoolean([0])
oder!![0]
) verwenden, werden Sie feststellen, dass[0]
diesetrue
in booleschen Kontexten ausgewertet wird, wie es sollte: In JS wird jedes Objekt berücksichtigttrue
Ein Array eines Elements kann als das Element selbst behandelt werden.
Dies ist auf die Eingabe von Enten zurückzuführen. Seit "2" == 2 == [2] und möglicherweise mehr.
quelle
==
Operator vor dem Vergleich durchführt.Um den anderen Antworten ein kleines Detail hinzuzufügen ... Beim Vergleich
Array
von aNumber
mit a konvertiert Javascript dasArray
mitparseFloat(array)
. Sie können es selbst in der Konsole versuchen (z. B. Firebug oder Web Inspector), um zu sehen, in welche unterschiedlichenArray
Werte konvertiert wird.Führt für
Array
sparseFloat
die Operation für dasArray
erste Mitglied des und führt den Rest aus.Bearbeiten: Laut Christophs Details kann es sein, dass das längere Formular intern verwendet wird, aber die Ergebnisse sind durchweg identisch mit
parseFloat
, sodass Sie immerparseFloat(array)
als Kurzform verwenden können, um sicher zu wissen, wie es konvertiert wird.quelle
Sie vergleichen in jedem Fall 2 Objekte. Verwenden Sie nicht ==. Wenn Sie an einen Vergleich denken, denken Sie an === und nicht an ==. == kann oft verrückte Effekte hervorrufen. Suche nach den guten Teilen in der Sprache :)
quelle
Erläuterung zum Abschnitt BEARBEITEN der Frage:
1. Beispiel
Erste Typumwandlung [0] auf einen primitiven Wert gemäß Christophs Antwort oben haben wir "0" (
[0].valueOf().toString()
)Geben Sie nun Boolean (false) in Number und String ("0") in Number ein
Was
if
Aussage, wenn gibt es keine explizite Vergleich im Zustand , wenn sich die Bedingung auswertet für truthy Werte.Es gibt nur 6 falsche Werte : false, null, undefined, 0, NaN und leere Zeichenfolge "". Und alles, was kein falscher Wert ist, ist ein wahrer Wert.
Da [0] kein Falschwert ist, sondern ein Wahrheitswert, wird die
if
Anweisung als wahr ausgewertet und die Anweisung ausgeführt.2. Beispiel
Geben Sie die Werte erneut in primitiv um.
quelle