如何检查两个变量是否具有相同的引用?


Answers:


85

您使用=====

var thesame = obj1===obj2;

从MDN:

如果两个操作数都是对象,则JavaScript将比较内部引用,当操作数引用内存中的同一对象时,内部引用是相等的。


12
这在大多数情况下都有效,并且可能适用于原始海报。但是,如果两个字符串是独立制造的并且包含相同的内容,则在进行深度字符串比较之后=====Object.is都将返回true。从最严格的意义上讲,原始海报希望比较返回假。我遇到了一个不可思议的情况,在那我也希望这种比较是错误的,并且找不到一个好的解决方案。我真正需要的是来自.NET的Object.referenceEquals的JS等效项
bigh_29 '18

以及如何显示其参考?
getName

3
@getName您的意思是内部引用?它由实现管理,由实现定义,并且不导出。
DenysSéguret19年

@DenysSéguret我的意思是一个对象或原始变量的引用,并且想知道该引用以执行一些测试,我知道它可以在其他一些语言(如python)中显示,但不确定在JS上是否可行
getName

1
想法:由于内部引用是由实现管理的,并且不公开,因此我们可以做以下技巧:我们将尝试在第一个对象上临时添加+1,并将其随机值添加为随机命名的新属性,然后检查是否出现期望的属性在第二个对象上!当然,我们会在添加之前检查该属性是否不存在,并且在进行侵入式检查后进行清理。
德米特里Shevkoplyas,

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,那将是true,因为两个变量的引用现在都相同。


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
OP正在询问是否要检测相同的引用,而不是相等。
faintsignal
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.