【发布时间】: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。
【问题讨论】:
标签: javascript instance
假设我在 Javascript 中有以下对象:
var a = { xxx: 33 };
var b = { xxx: 33 };
var c;
c = a;
什么是 Javascript 测试可以告诉我是否正在处理同一个对象实例?换句话说,对于 a 和 b、b 和 c,它应该返回 false,但对于 a 和 c,它应该返回 true。
【问题讨论】:
标签: javascript instance
你只需要这个
if(c == a) {
// same instance
}
a == b 和 b == c 将返回 false
【讨论】:
只是一个标准的平等测试:
( a == c ) // true
( a == b ) // false
【讨论】:
我知道问题是关于检查两个对象是否是同一个实例,但是如果没有以下内容,这个线程将不完整。
如果您在检查 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 进行比较而不明确说明。
【讨论】: