如何在Javascript中测试相同的对象实例?

36

假设我在JavaScript中有以下对象:

var a = { xxx: 33 };
var b = { xxx: 33 };
var c;

c = a;

有一个 JavaScript 测试可以告诉我是否正在处理同一对象实例吗?换句话说,它应该对 a 和 b、b 和 c 返回 false,但对 a 和 c 返回 true。

3个回答

36

你只需要这个

if(c == a) {
   // same instance
}

a == bb == c将返回false


2
对我来说,这实际上是JS中的一个错误。==应该是值比较,而===是值+类型比较。在我看来,a == b应该返回true,a === b返回false。相反,您必须使用JSON操作将其分解为字符串值并执行值比较。现在的情况是,对于对象比较,==和===之间没有区别。 - Craig

14

只是一个标准的相等性测试:

( a == c ) // true
( a == b ) // false

6
为什么不用三个等号? - sanchez
2
@san.chez - 比较对象时没有区别。 - Quentin
5
@san.chez,在这里没有区别,但是要关闭我不想要的功能,我会在这里使用三个等号(以及几乎任何地方)。 - Robert Siemer

8

我知道这个问题是关于检查两个对象是否是同一个实例的,但如果不提供以下内容,这个线程将不完整。

如果您想要检查2个对象是否相同,双等号==就足够了。然而,对于值类型(原始类型),您可能会感到惊讶。请看以下示例:

var a = 1;  // Integer 1
var b = '1' // String '1'
if (a == b) console.log('Same.');
else console.log('Not same.');

上面的代码会输出Same.。为了避免这种情况,可以使用三个等于号===,它的含义是两个方面:
  1. 它们的值是否相同?
  2. 它们的类型是否相同?
或者,您可以使用Object.is方法,像这样:Object.is(a, b)
if (a === b) console.log('Same.');
else console.log('Not same.');
if (Object.is(a, b)) console.log('Same for Object.is.');
else console.log('Not same for Object.is.'); 

以上代码将打印出Not same.Not same for Object.is.更多信息 下面是一些拷贝自此文章的信息:
哪种比较操作取决于您要执行何种类型的比较。简而言之:
- 双等号(==)在比较两个值时将执行类型转换,并特殊处理NaN、-0和+0以符合IEEE 754标准(因此NaN != NaN,-0 == +0); - 三等号(===)将执行与双等号相同的比较(包括特殊处理NaN、-0和+0),但不进行类型转换;如果类型不同,则返回false。 - Object.is不进行类型转换,也不特殊处理NaN、-0和+0(在这些特殊的数字值上,它的行为与===相同)。
请注意,它们之间的区别都与原语的处理有关;它们中没有任何一个比较参数是否在结构上概念上相似。对于任何具有相同结构但是本身是不同对象的非原始对象x和y,上述所有形式都将评估为false。
结论
我对此的看法是,养成始终使用三等号===的习惯,因为它不会伤害你,但双等号==确实会对您造成伤害。当您只关心值并且要比较的东西是原始类型时,可以使用双等号==;但即使如此,也不建议这样做,因为这主要意味着设计上的缺陷。像TypeScript这样的语言甚至会避免这种情况,即比较一个'1'和1而不明确说明。

我个人认为这应该是被选中的答案,因为它还提供了完整的背景信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接