如何在 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 == b
和 b == 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 对象