Як перевірити, чи два вари мають однакові посилання?


75

Як можна перевірити, чи два або більше об’єктів / варіантів мають однакові посилання?

Відповіді:


85

Ви використовуєте ==або ===:

var thesame = obj1===obj2;

З MDN:

Якщо обидва операнди є об'єктами, тоді JavaScript порівнює внутрішні посилання, які рівні, коли операнди посилаються на той самий об'єкт у пам'яті.


12
Це працює в більшості випадків і може працювати для оригінального плаката. Однак, якщо два рядки були виготовлені самостійно і містять однаковий вміст, тоді ==, ===і Object.isвсі повернуться істинними після глибокого порівняння рядків. У найсуворішому сенсі оригінальний плакат хоче, щоб порівняння повернуло неправду. Я зіткнувся з таємничою ситуацією, коли я також хотів, щоб це порівняння було хибним, і не міг знайти хорошого рішення. Що мені справді потрібно, це еквіваленти JS Object.referenceEquals від .NET
bigh_29

і як відобразити його посилання?
getName

3
@getName Ви маєте на увазі внутрішнє посилання? Це управляється реалізацією, визначено реалізацію та не експортується.
Денис Сегурет,

@ DenysSéguret Я маю на увазі посилання на об'єкт або примітивну змінну і хоче знати це посилання, щоб виконати деякі тести, я знаю, що це може бути показано на деяких інших мовах, таких як python, але не впевнений, що це можливо на JS
getName

1
ідея: оскільки внутрішнє посилання управляється реалізацією і не піддається, ми можемо зробити такий фокус: ми спробуємо тимчасово додати +1 довільно іменовану нову властивість із випадковим значенням на 1-му об’єкті, а потім перевірити, чи з’являється очікувана властивість на 2-му об’єкті! Зважаючи на це, ми перевіримо, чи не існує ця властивість перед додаванням, і очистимо після настирливої ​​перевірки.
Дмитро Шевкопляс

18

Оператори рівності та суворої рівності одночасно повідомлять вам, якщо дві змінні вказують на один і той же об’єкт.

foo == bar
foo === bar

7

Для типу посилання, як-от об'єкти, оператори == або === перевіряють лише його посилання.

напр

let a= { text:'my text', val:'my val'}
let b= { text:'my text', val:'my val'}

тут a == b буде помилковим, оскільки посилання на обидві змінні різні, хоча їх зміст однаковий.

але якщо я зміню його на

a=b

і якщо я перевірю зараз a == b, то це буде правдою, оскільки посилання обох змінних зараз однакові.


4

Починаючи з цього ES2015, Object.is()було запроваджено новий метод , який можна використовувати для порівняння та оцінки однаковості двох змінних / посилань:

Нижче наведено кілька прикладів:

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

Демо:

Примітка: Цей алгоритм відрізняється від алгоритму порівняння строгих рівностей обробкою підписаних нулів та NaN.


1

Можливий алгоритм:

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
ОП запитує про виявлення однакових посилань, а не про рівність.
faintsignal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.