Wie können Sie überprüfen, ob zwei oder mehr Objekte/Variablen dieselbe Referenz haben?
Wie überprüfe ich, ob zwei Variablen dieselbe Referenz haben?
Clark
Denys Séguret
Sie nutzen ==
oder ===
:
var thesame = obj1===obj2;
Wenn beide Operanden Objekte sind, vergleicht JavaScript interne Referenzen, die gleich sind, wenn Operanden auf dasselbe Objekt im Speicher verweisen.
-
Dies funktioniert in den meisten Fällen und möglicherweise für das Originalplakat. Wenn jedoch zwei Zeichenfolgen unabhängig hergestellt wurden und denselben Inhalt enthalten, dann
==
,===
undObject.is
werden alle nach einem tiefen Zeichenfolgenvergleich wahr zurückgeben. Streng genommen möchte der Originalposter, dass der Vergleich falsch zurückgibt. Ich bin auf eine geheimnisvolle Situation gestoßen, in der ich auch wollte, dass dieser Vergleich falsch ist, und konnte keine gute Lösung finden. Was ich wirklich brauche, sind die JS-Äquivalente von Object.referenceEquals aus .NET– groß_29
31. Oktober 2018 um 21:49 Uhr
-
und wie man seine Referenz anzeigt?
– getName
27. Mai 2019 um 12:23 Uhr
-
@getName Du meinst die intern Hinweis ? Es wird von der Implementierung verwaltet, ist von der Implementierung definiert und wird nicht exportiert.
– Denys Séguret
27. Mai 2019 um 13:02 Uhr
-
@DenysSéguret Ich meine die Referenz eines Objekts oder einer primitiven Variablen und möchte diese Referenz wissen, um einige Tests durchzuführen. Ich weiß, dass sie in einigen anderen Sprachen wie Python angezeigt werden kann, bin mir aber nicht sicher, ob dies in JS möglich ist
– getName
28. Mai 2019 um 14:06 Uhr
-
Idee: Da die interne Referenz von der Implementierung verwaltet und nicht offengelegt wird, können wir den folgenden Trick anwenden: Wir versuchen, vorübergehend +1 zufällig benannte neue Eigenschaft mit zufälligem Wert für das 1. Objekt hinzuzufügen und prüfen dann, ob die erwartete Eigenschaft tatsächlich erscheint am 2. Objekt! Natürlich würden wir vor dem Hinzufügen prüfen, ob diese Eigenschaft nicht existiert, und wir würden nach unserer aufdringlichen Prüfung aufräumen.
– Dmitri Schewkoplyas
28. Mai 2019 um 20:18 Uhr
Der Gleichheits- und der strikte Gleichheitsoperator sagen Ihnen beide, ob zwei Variablen auf dasselbe Objekt zeigen.
foo == bar
foo === bar
Für Referenztypen wie Objekte, == oder === Operatoren prüfen nur seine Referenz.
z.B
let a= { text:'my text', val:'my val'}
let b= { text:'my text', val:'my val'}
hier ist a==b falsch, da die Referenz beider Variablen unterschiedlich ist, obwohl ihr Inhalt gleich ist.
aber wenn ich es ändere
a=b
und wenn ich jetzt a==b überprüfe, dann wird es wahr sein, da die Referenz beider Variablen jetzt gleich ist.
Ab ES2015
eine neue Methode Object.is()
eingeführt, mit denen die Gleichheit zweier Variablen / Referenzen verglichen und bewertet werden kann:
Nachfolgend einige Beispiele:
Object.is('abc', 'abc'); // true
Object.is(window, window); // true
Object.is({}, {}); // false
const foo = { p: 1 };
const bar = { p: 1 };
const baz = foo;
Object.is(foo, bar); // false
Object.is(foo, baz); // true
Demo:
console.log(Object.is('abc', 'abc'));
console.log(Object.is(window, window));
console.log(Object.is({}, {}));
const foo = { p: 1 };
const bar = { p: 1 };
const baz = foo;
console.log(Object.is(foo, bar));
console.log(Object.is(foo, baz));
Notiz: Dieser Algorithmus unterscheidet sich vom Strict Equality Comparison Algorithmus in seiner Behandlung von vorzeichenbehafteten Nullen und NaNs.
Möglicher Algorithmus:
Object.prototype.equals = function(x)
{
var p;
for(p in this) {
if(typeof(x[p])=='undefined') {return false;}
}
for(p in this) {
if (this[p]) {
switch(typeof(this[p])) {
case 'object':
if (!this[p].equals(x[p])) { return false; } break;
case 'function':
if (typeof(x[p])=='undefined' ||
(p != 'equals' && this[p].toString() != x[p].toString()))
return false;
break;
default:
if (this[p] != x[p]) { return false; }
}
} else {
if (x[p])
return false;
}
}
for(p in x) {
if(typeof(this[p])=='undefined') {return false;}
}
return true;
}
-
Das OP fragt nach der Erkennung identischer Referenzen, nicht nach Gleichheit.
– schwaches Signal
27. Juni 2018 um 20:33 Uhr
-
Das OP fragt nach der Erkennung identischer Referenzen, nicht nach Gleichheit.
– schwaches Signal
27. Juni 2018 um 20:33 Uhr