2013-07-10 14 views
5

Czy ktoś może wyjaśnić, dlaczego te porównania nierówności JavaScriptu są prawdziwe?Równość/nierówność macierzy:

[""] !== [""] 

[1] !== [1] 

[] !== [] 


[""] != [""] 

[1] != [1] 

[] != [] 
+2

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

+0

@GeorgeCummins Cóż, w większości języków będzie tak samo. –

+1

myHouse i yourHouse są obydwoma domami, ale myHouse! == yourHouse -> true – Xotic750

Odpowiedz

8

=== jest ścisłe równość.
Porównując obiekty, zwraca wartość true tylko wtedy, gdy obie strony odnoszą się do tego samego obiektu.

[] i [] są dwoma różnymi (chociaż równoważnymi) obiektami, więc zwraca wartość false.


== to luźna równość.

Spróbuje przymusić oba operandy do tego samego typu, jak opisano w spec.

Jednak również porównuje obiekty według tożsamości referencyjnej.

+0

Pamiętaj, że porównanie literałów łańcuchowych da wartość true ("a" === "a"), ale porównywanie obiektów String da wartość false: new String ("a ") === nowy ciąg (" a "). W ten sposób stwierdzam, że literały łańcuchowe nie są traktowane jako obiekty i "internowane" w sposób podobny do języka Java. –

+1

@normc: Nie. W przeciwieństwie do Java, Javascript ma ciąg _primitive_ type, podobnie jak liczby. 'new String (" a ")' umieszcza go w obiekcie. Na przykład 'var a =" a "; a.b = 2; alert (a.b); // undefined' – SLaks

+0

@normc: Zapakowane obiekty łańcuchowe prawie nigdy nie są używane; wszystkie operacje łańcuchowe zwracają prymitywy. – SLaks

Powiązane problemy