Wie überprüfe ich, ob zwei Variablen dieselbe Referenz haben?

Lesezeit: 3 Minuten

Benutzer-Avatar
Clark

Wie können Sie überprüfen, ob zwei oder mehr Objekte/Variablen dieselbe Referenz haben?

Benutzer-Avatar
Denys Séguret

Sie nutzen == oder === :

var thesame = obj1===obj2;

Aus dem MDN:

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 ==, === und Object.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 ES2015eine 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

1187060cookie-checkWie überprüfe ich, ob zwei Variablen dieselbe Referenz haben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy