Як можна перевірити, чи два або більше об’єктів / варіантів мають однакові посилання?
Відповіді:
Ви використовуєте ==
або ===
:
var thesame = obj1===obj2;
Якщо обидва операнди є об'єктами, тоді JavaScript порівнює внутрішні посилання, які рівні, коли операнди посилаються на той самий об'єкт у пам'яті.
Для типу посилання, як-от об'єкти, оператори == або === перевіряють лише його посилання.
напр
let a= { text:'my text', val:'my val'}
let b= { text:'my text', val:'my val'}
тут a == b буде помилковим, оскільки посилання на обидві змінні різні, хоча їх зміст однаковий.
але якщо я зміню його на
a=b
і якщо я перевірю зараз a == b, то це буде правдою, оскільки посилання обох змінних зараз однакові.
Починаючи з цього 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.
Можливий алгоритм:
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;
}
==
,===
іObject.is
всі повернуться істинними після глибокого порівняння рядків. У найсуворішому сенсі оригінальний плакат хоче, щоб порівняння повернуло неправду. Я зіткнувся з таємничою ситуацією, коли я також хотів, щоб це порівняння було хибним, і не міг знайти хорошого рішення. Що мені справді потрібно, це еквіваленти JS Object.referenceEquals від .NET