【问题标题】:javascript object comparison: equal vs strict equaljavascript对象比较:相等与严格相等
【发布时间】:2013-07-10 13:18:22
【问题描述】:

===== 的区别在于前者只检查值(1 == "1" 将返回true),后者是否检查值并额外检查类型(1 === "1" 将返回false,因为@987654326 @ 不是字符串)。

比较对象意味着比较对象引用(对象变量保存它们引用的对象的内部地址,并且正在比较这些地址)。如果两个对象具有完全相同的键和值、函数等,但它们是独立的对象,== 将返回 false,因此 === 也将返回 false。

问题是:如果我使用===== 比较运算符关于JavaScript 对象 有什么不同吗? PS如果我在任何地方错了,请纠正我并解释(我会接受它作为问题答案)

编辑:这不是关于 javascript 原语,所以比较对象和原语是题外话。

【问题讨论】:

  • @taylorc93 我只问对象,而不是所有类型(包括原语)。
  • 还意识到 === 也有文档用途。使用 === 如果重要的是表明它是严格相等的,而不仅仅是计算为相等
  • 这两种操作符的区别比这更复杂。了解更多关于它们,你会得到你想要的答案。
  • @tkoomzaaskz:使用了两种算法。 === 使用的严格等式比较算法== 使用的抽象等式比较算法。它们都从测试两个操作数的内部 Type(与typeof 略有不同)开始。当类型匹配时,两种算法的下一步是相同的。当类型匹配时,Strict 简单地返回false,但 Abstract 开始一个将操作数强制为原始类型并递归调用相同算法的过程。直到操作数被强制匹配类型为止。

标签: javascript object comparison


【解决方案1】:

用户定义对象的简单比较(我假设您询问的是它们而不是字符串和数字等原语),永远不会返回 true,因此使用它没有意义。您可以通过比较它们的原型和构造函数来检查两个对象是否属于同一类型,但是无论使用 == 还是 === 都无关紧要。唯一的区别是比较可能返回 true。但这当然并没有说明实例的属性,两个具有相同原型和构造函数的实例可能具有不同的属性

function cat1 () {
    this.name = "blacky";
    this.age =  9;
}

function cat2 () {
    this.name = "blacky";
    this.age  = 9;
}


var anton = new cat1()
var john  = new cat2()
var kevin = new cat1()

console.log(anton == kevin) // false
console.log(anton == john) // false
console.log(anton === john) // false
console.log(anton === kevin) // false
console.log(anton.__proto__ == kevin.__proto__) // true
console.log(anton.constructor == kevin.constructor) // true
console.log(anton.constructor == john.constructor) // false
console.log(anton.__proto__ == john.__proto__) // false

总而言之,您的问题的答案是:不,使用 == 或 === 比较对象没有任何区别,因为比较它们总是返回 false。如果你想比较用户定义的(不是原始的)类型,你应该使用返回每个对象原型的对象的 proto 方法直接比较它们。

【讨论】:

  • 这不是使用非标准的 proto 来检查对象是否属于某种类型吗?它不检查对象值。如果我有 2 个值与 d1.__proto__===d2.__proto__ 完全不同的日期对象,将返回 true,因为它们都是日期
  • 感谢上帝,有人理解我的问题。感谢您准确阅读问题。就像我想的那样,如果 2 个变量引用同一个对象,与 == 和 === 进行比较将始终返回 true。如果它们引用内存中的不同对象,则两个比较都将返回 false。总是。这就是问题所在。 __proto__ 是一个不同的主题,我理解它们;)顺便说一下,__proto__ 是非标准的,我们应该避免使用它。
  • @tkoomzaaskz:FWIW,__proto__ 设置为在 ECMAScript 6 中标准化。
猜你喜欢
  • 2018-09-20
  • 1970-01-01
  • 2021-10-10
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多