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

Posted

技术标签:

【中文标题】如何在 Javascript 中测试相同的对象实例?【英文标题】:How to test same object instance in Javascript? 【发布时间】:2014-11-30 15:18:54 【问题描述】:

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

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

c = a;

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

【问题讨论】:

【参考方案1】:

你只需要这个

if(c == a) 
   // same instance

a == bb == c 将返回 false

【讨论】:

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

只是一个标准的平等测试:

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

【讨论】:

为什么不三等分? @san.chez — 比较对象时没有区别。 @san.chez,here 没有区别,但要关闭我不希望的功能,我会在此处(以及几乎所有地方)使用三等式。跨度> 【参考方案3】:

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

如果您在检查 2 个对象是否相同之后,双相等 == 就足够了。但是,对于值类型(原语),您可能会感到惊讶。查看以下内容:

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

上面将打印Same.。为避免这种情况,请使用三等号 ===,这意味着两件事:

    它们的值是否相同? 它们是同一类型吗?

或者您可以使用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.

更多信息

以下是从article复制/粘贴的更多信息:

您选择哪种操作取决于您希望执行的比较类型。简要说明:

double equals (==) 将在比较两个事物时执行类型转换,并且会特别处理 NaN、-0 和 +0 以符合 IEEE 754(因此 NaN != NaN 和 -0 == +0 );

三等号 (===) 将进行与双等号相同的比较(包括对 NaN、-0 和 +0 的特殊处理),但不进行类型转换;如果类型不同,则返回 false。

Object.is 不进行类型转换,也不对 NaN、-0 和 +0 进行特殊处理(赋予它与 === 相同的行为,除了那些特殊的数值)。

请注意,它们之间的区别都与它们对原语的处理有关;他们都没有比较参数在结构上是否在概念上相似。对于任何具有相同结构但本身是不同对象的非原始对象 x 和 y,上述所有形式都将评估为 false。


结论

我的两分钱就是养成始终使用三等号=== 的习惯,因为它不会伤害你,但双等号== 确实会伤害你时间>。当您只关心值并且您正在比较的事物是原语时,您可以使用 double equals ==;但即使这样也不鼓励,因为它主要意味着设计上的缺陷。像 TypeScript 这样的语言甚至会避免这种情况,即将 '1' 与 1 进行比较而不明确说明。

【讨论】:

以上是关于如何在 Javascript 中测试相同的对象实例?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Unity 游戏引擎平台上的单元测试中实例化 MonoBehaviour 对象

JavaScript如何比较两个数组的内容是否相同

删除javascript数组中重复对象的所有实例[重复]

Sling/OSGi 请求范围对象问题。如何访问过滤器和服务类中对象的相同实例(在相同的请求上下文中)?

03. JavaScript高级(3/5)(原型链讲解)

如何检查两个对象是不是具有相同的一组属性名称?