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


75

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

Antworten:


85

Sie verwenden ==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.


12
Dies funktioniert in den meisten Fällen und möglicherweise für das Originalplakat. Wenn zwei Saiten hergestellt wurden unabhängig voneinander jedoch und enthalten die gleichen Inhalte, dann ==, ===und Object.iswerden alle true zurück , nach einem tiefen String - Vergleich durchführen. Im strengsten Sinne möchte das Originalplakat, dass der Vergleich falsch ist. Ich bin auf eine arkane 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-Entsprechungen von Object.referenceEquals aus .NET
bigh_29

und wie wird die Referenz angezeigt?
getName

3
@getName Du meinst die interne Referenz? Es wird von der Implementierung verwaltet, ist implementiert und wird nicht exportiert.
Denys Séguret

@ DenysSéguret Ich meine die Referenz eines Objekts oder einer primitiven Variablen und möchte diese Referenz kennen, 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 unter JS möglich ist
getName

1
Idee: Da die interne Referenz von der Implementierung verwaltet wird und nicht verfügbar gemacht wird, können wir den folgenden Trick ausführen: Wir werden versuchen, vorübergehend +1 zufällig benannte neue Eigenschaft mit zufälligem Wert für das 1. Objekt hinzuzufügen und dann zu überprüfen, ob die erwartete Eigenschaft zufällig angezeigt wird auf dem 2. Objekt! Natürlich würden wir vor dem Hinzufügen prüfen, ob diese Eigenschaft nicht vorhanden ist, und nach unserer aufdringlichen Prüfung aufräumen.
Dmitry Shevkoplyas

17

Die Gleichheitsoperatoren und die strengen Gleichheitsoperatoren geben an, ob zwei Variablen auf dasselbe Objekt verweisen.

foo == bar
foo === bar

6

Bei referenztypähnlichen Objekten überprüfen die Operatoren == oder === nur die 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 ist es wahr, da die Referenz beider Variablen jetzt gleich ist.


3

Ab sofort ES2015wurde eine neue Methode Object.is()eingeführt, mit der 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:

Hinweis: Dieser Algorithmus unterscheidet sich vom Strict Equality Comparison-Algorithmus durch die Behandlung von vorzeichenbehafteten Nullen und NaNs.


1

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;
}

10
Das OP fragt nach identischen Referenzen, nicht nach Gleichheit.
Faintsignal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.