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?
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:
Der <
/ >
Trick ist fehlerhaft:
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.
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
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:
Tags und Links javascript arrays equality