2013-07-10 9 views
5

Kann jemand erklären, warum diese Ungleichungen von JavaScript-Arrays als wahr bewertet werden?Array-Gleichheit/Ungleichheit

[""] !== [""] 

[1] !== [1] 

[] !== [] 


[""] != [""] 

[1] != [1] 

[] != [] 
+2

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators –

+0

@GeorgeCummins Nun, das wäre in den meisten Sprachen dasselbe. –

+1

myHouse und yourHouse sind beide Häuser, aber myHouse! == yourHouse -> true – Xotic750

Antwort

8

=== ist strenge Gleichheit.
Beim Vergleich von Objekten wird nur true zurückgegeben, wenn beide Seiten auf dasselbe Objekt verweisen.

[] und [] sind zwei verschiedene (wenngleich äquivalente) Objekte, daher wird false zurückgegeben.


== ist lose Gleichheit.

Es wird versucht, beide Operanden auf den gleichen Typ zu zwingen, wie in der spec beschrieben.

Es vergleicht jedoch auch Objekte durch referenzielle Identität.

+0

Beachten Sie, dass das Vergleichen von String-Literalen wahr ergibt ("a" === "a"), aber der Vergleich von String-Objekten ergibt false: new String ("a ") === neuer String (" a "). Ich folge daraus, dass String-Literale nicht als Objekte behandelt und ähnlich wie Java "interniert" werden. –

+1

@normc: Nein. Im Gegensatz zu Java hat Javascript eine Zeichenfolge _primitive_, genau wie Zahlen. 'new String (" a ")' boxiert es auf ein Objekt. Zum Beispiel: var a = "a"; a.b = 2; Alarm (a.b); // undefined' – SLaks

+0

@normc: Boxed String Objekte werden fast nie benutzt; Alle String-Operationen geben Primitive zurück. – SLaks