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

cla*_*rkk 57 javascript

如何检查两个或多个对象/ vars是否具有相同的引用?

Den*_*ret 72

你使用=====:

var thesame = obj1===obj2;
Run Code Online (Sandbox Code Playgroud)

来自MDN:

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

  • 这适用于大多数情况,可能适用于原始海报.但是,如果两个字符串是独立制作并包含相同的内容,那么`==`,`===`和`Object.is`将在执行深度字符串比较后返回true.在最严格的意义上,原始海报希望比较返回虚假.我遇到了一个神秘的情况,我也希望这种比较是错误的,并且找不到一个好的解决方案.我真正需要的是.NET的Object.referenceEquals的JS等价物 (4认同)
  • @getName 你的意思是 *internal* 引用?它由实现管理,是实现定义的,不导出。 (3认同)
  • 想法:由于内部引用是由实现管理的并且不公开,我们可以执行以下技巧:我们将尝试在第一个对象上临时添加+1个随机命名的具有随机值的新属性,然后检查预期的属性是否恰好出现关于第二个对象!当然,我们会在添加之前检查该属性是否不存在,并在侵入性检查后进行清理。 (3认同)

Que*_*tin 15

如果两个变量指向同一个对象,则相等和严格相等运算符都会告诉您.

foo == bar
foo === bar
Run Code Online (Sandbox Code Playgroud)


Raj*_*jiv 11

对于像对象这样的引用类型,=====运算符仅检查其引用。

例如

let a= { text:'my text', val:'my val'}
let b= { text:'my text', val:'my val'}
Run Code Online (Sandbox Code Playgroud)

这里 a==b 将是假的,因为尽管它们的内容相同,但两个变量的引用不同。

但如果我把它改成

a=b
Run Code Online (Sandbox Code Playgroud)

如果我现在检查 a==b 那么它将是 true ,因为现在两个变量的引用是相同的。


Moh*_*man 5

从 开始ES2015Object.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
Run Code Online (Sandbox Code Playgroud)

演示:

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
Run Code Online (Sandbox Code Playgroud)

注意:该算法在处理有符号零和 NaN 方面与严格相等比较算法不同。