Dreifache Gleichheitszeichen geben false für Arrays in Javascript zurück. Warum?

7

Ich weiß, dass === typischerweise als Identitätsoperator bezeichnet wird. Die verglichenen Werte müssen vom gleichen Typ und Wert sein, um als gleich zu gelten. Warum gibt die untere Zeile false zurück?

Array("asdf") === Array("asdf")

    
2619 07.12.2012, 04:51
quelle

4 Antworten

23

Sie sind nicht gleich, weil in jeder dieser Anweisungen ein neues Array erstellt wird, wobei jedes ein brandneues Array-Objekt mit genau identischen Inhalten ist. Wenn Sie zwei neue Objekte erstellen:

%Vor%

Wenn Sie neue Objekte, Arrays, Funktionen usw. erstellen, wird ein brandneues Objekt in den Speicher geladen. Das Erstellen eines neuen Objekts mit den gleichen Interna wie ein anderes Objekt führt nicht dazu, dass das Objekt auf eine bereits existierende verweist. Die Objekte können gleich aussehen, aber sie zeigen nicht auf dieselbe Instanz. Nun, wenn Ihre Aussage so gewesen wäre:

%Vor%

Das ist offensichtlich wahr. === ist strikte Gleichheit, kein Identitätsoperator. Wenn Objekte durch einen strikten Gleichheitsoperator durchlaufen werden, werden sie überprüft, um zu sehen, ob sie auf die gleiche Referenz zeigen. Ich erklärte, dass jedes Mal, wenn Sie new Array oder [] verwenden, ein brandneues Objekt erstellt wird, von denen jedes eine neue und andere Referenz ist. Es gibt also keine Möglichkeit, dass zwei Arrays oder any -Objekte herauskommen können, wenn === wahr ist, es sei denn, zeigen auf genau das selbe Array . Nur weil zwei Objekte mit identischen Inhalten erzeugt werden, heißt das nicht, dass sie auf das gleiche Objekt zeigen, sondern nur auf zwei identische, aber unterschiedliche Objekte.

Stellen Sie sich Funktionen zusammen:

%Vor%

Nur weil Sie denselben Konstruktor verwenden, bedeutet das nicht, dass jedes Mal, wenn Sie ihn aufrufen, das gleiche Objekt zurückgegeben wird. Vielmehr wird jedes Mal ein neues Objekt zurückgegeben. Nur weil beide Autos grün sind, heißt das nicht, dass es das gleiche Auto ist.

%Vor%

Dies ist nun richtig, weil beide Variablen auf genau die Car Referenz zeigen.

    
Eli 07.12.2012, 04:56
quelle
4

Zuallererst === ist strikte Gleichheit, kein Identitätsoperator und Arrays, wie Objekte sind Referenzobjekte, keine Wertobjekte wie im Fall von Zahlen und Strings ...

Wenn Sie also diese beiden Arrays vergleichen, erstellen Sie zwei verschiedene Arrays im Speicher. Es wäre dasselbe wie zu sagen ...

%Vor%

Sie können Arrays oder Objekte nicht direkt vergleichen.

    
jcreamer898 07.12.2012 05:01
quelle
3

Wenn es sich nicht um einen primitiven Typ handelt (String, Zahl, Boolesch), wenn es sich um ein Array oder ein Objekt handelt, überprüfen die Vergleichsoperatoren, ob es genau dieselbe Instanz ist. Also

%Vor%

Sie müssen also im Prinzip eine eigene Methode definieren, um Arrays zu vergleichen und zu sehen, ob alle Elemente gleich sind. Diese Art von Funktion existiert normalerweise nicht, weil sie sehr teuer sein kann, und es gibt normalerweise eine andere Möglichkeit, solche Dinge zu schreiben.

    
Damon Smith 07.12.2012 04:57
quelle
0

Während array1==array2 nicht funktioniert (Objektidentitätsgleichheit),

Einfachste Option, funktioniert in fast allen Fällen, außer null!==undefined , aber beide werden in null konvertiert und als gleich betrachtet:

%Vor%     
Zaheer Ahmed 07.12.2012 05:02
quelle

Tags und Links