Warum oder wie beweist dies die Gleichheit von JavaScript-Arrays?

8

In dieser Antwort gibt es eine einfache Funktion, die Array-Gleichheit für Arrays zurückgibt, die primitive Werte enthalten.

>

Ich bin mir jedoch nicht sicher, warum es funktioniert. Hier ist die Funktion:

%Vor%

Ich bin hauptsächlich an der zweiten Hälfte interessiert; dieses Bit:

%Vor%

Warum funktioniert < und > beim Vergleich der Arrays, aber == nicht?

Wie funktionieren die weniger als und größer als Methoden in JavaScript?

    
Bill Rawlinson 17.02.2012, 19:30
quelle

3 Antworten

10

Bei < / > werden die Arrays zuerst in Zeichenfolgen konvertiert und bieten daher keine zuverlässige Methode zur Überprüfung der Gleichheit.

== funktioniert nicht, weil Objekte durch Referenz überprüft werden:

%Vor%

Der < / > Trick ist fehlerhaft:

%Vor%

Dies ergibt true , weil sie beide in den String "1,2,3" konvertiert werden, bevor sie überprüft werden ( < / > funktionieren nicht "direkt" für Objekte).

Sie vergleichen also grundsätzlich die Gleichheit der Strings. Für Zeichenfolgen ist a == b tatsächlich identisch mit !(a<b || b<a) - < / > für Zeichenketten, die Zeichenkodierungen überprüfen, so dass zwei gleiche Zeichenfolgen weder "kleiner" noch "größer" sind, da dies für einen Zeichencode nicht der Fall ist in den Strings.

    
pimvdb 17.02.2012 19:35
quelle
5
  

Allerdings bin ich nicht sicher, warum es funktioniert.

Es funktioniert nicht. Bedenken Sie

%Vor%

ergibt true, obwohl sie bei jeder Definition der Array-Gleichheit, die auf einem elementweisen Vergleich beruht, unterschiedlich sind.

%Vor%

und

%Vor%

sind auch falsche Positive.

Das Hinzufügen von length checking wird nicht helfen, wie von

demonstriert %Vor%

BEARBEITEN:

Wenn Sie einen kurzen Weg suchen, strukturelle Ähnlichkeit zu testen, schlage ich vor:

%Vor%

Es hört nicht früh mit Eingaben auf, die offensichtlich anders sind - es führt beide Objektgraphen, unabhängig davon, wie ungleich sie sind, aber auch die Funktion im OP.

Ein Vorbehalt: Wenn Sie nicht-native JSON.stringify verwenden, kann es seltsame Dinge für zyklische Eingaben wie:

tun %Vor%     
Mike Samuel 17.02.2012 19:40
quelle
4

Sie können zwei beliebige Objekte mit == vergleichen. Aber seit & gt; und & lt; sind nicht für Objekte definiert, sie werden in Strings konvertiert. Daher macht [1,2,3]>[2,1,3] tatsächlich "1,2,3">"2,1,3"

    
Diego 17.02.2012 19:38
quelle

Tags und Links