【问题标题】:Comparing objects in JavaScript比较 JavaScript 中的对象
【发布时间】:2014-08-05 06:15:43
【问题描述】:

我有这个代码:

var object1 = {same:'test'}
var object2 = {same:'test'};       
console.log(object1 === object2)

它在控制台中返回 false

我也有这个代码:

var object1 = {same:'test'}
var object2 = object1;
console.log(object1 === object2)  

它在控制台中返回 true

我知道 '===' 是一个相等运算符,但我不知道它是如何作用于对象的。

为什么第一个例子返回 false?

【问题讨论】:

  • 对象总是通过引用进行比较,而不是相等
  • 删除了不正确的“重复”标志。
  • @NiettheDarkAbsol 重复标志不正确? SO上有很多类似的问题(例如这个,也被标记为重复:stackoverflow.com/questions/1068834/…)这个有什么区别?
  • 嗯,这不是同一个问题。在您的链接中,OP 询问“我知道‘如果两个对象引用完全相同的对象,它们是相等的’,但是有没有办法以另一种方式检查它??”。而在这篇文章中,OP 不知道“如果两个对象引用完全相同的对象,则它们是相等的”,这就是他所要求的。
  • 如果你想要另一个例子,这是完全相同的问题:stackoverflow.com/questions/22828341/…

标签: javascript


【解决方案1】:

看到这个球了吗?它的颜色是红色。叫它ball1。

看到这个球了吗?它的颜色是红色。叫它ball2。

ball1 和 ball2 是同一个对象吗?不,它们是恰好具有相同属性的不同对象。


看到这个球了吗?它的颜色是红色。叫它ball1。

我们叫ball1,ball2。

ball1 和 ball2 是同一个对象吗?是的。他们是同一个球。

【讨论】:

  • 很好的比喻。还要考虑如果我们决定将球 2 涂成绿色,球 1 会发生什么。
  • 很好的类比(我完全是在偷它):)
  • +1。解释我如何问“这两个球的外观和行为是否相同?”的奖励积分
  • 适用于多种语言。不仅是java脚本。这篇文章应该被添加到 Stackoverflow wiki :D
  • 这是一个不错的类比,但它也可能有助于解释计算机在为变量分配值时实际在做什么,以便 OP 可以了解更多关于他们两个示例背后发生的事情。
【解决方案2】:

对象通过引用相等性进行比较,由于object1object2 是两个不同的实例,它们是不同的对象(可以认为:它们在内存中占据不同的位置)。

但是,如果您将 object1 分配给 object2,它们都指向内存中的同一个位置,因此是相等的(它们是对同一个对象的两个引用,它在内存中只存在一次)。通过object1.same = 'uiae'; 更改属性也会更新属性object2.same(因为它们实际上是相同的对象和相同的属性)

【讨论】:

    【解决方案3】:
    var object1 ={same:'test'}
    var object2 ={same:'test'};       
    console.log(object1 === object2)
    

    在这种情况下,您将创建两个不同的对象。这就是为什么它在使用 === 运算符检查时在控制台中返回 false 值的原因。

    var object1 ={same:'test'}
    var object2 =object1;
    console.log(object1 === object2)
    

    在这种情况下,您正在创建一个对象,并且 object1 和 object2 引用创建的对象,这就是当您使用 === 运算符检查时它返回 true 的原因。

    在第二种情况下,如果我们更改 object2["same"]="test2",那么 object1["same"] 的值也会更改为 test2

    在第一种情况下不会这样,因为 object1object2 是两个不同的对象。

    参考这个: Object Equality in JavaScript

    希望这可能会有所帮助。

    【讨论】:

      【解决方案4】:

      在第一种情况下,Object1 和 Object2 是两个不同的参考点(或变量),指向内存中的两个不同对象。因此,当您检查它们是否相等时,结果为 false。

      在第二种情况下,您只是将参考点(地址)从 Object1 复制到 Object2,这意味着两个参考点现在都指向内存中的同一个对象。所以结果为真。

      对象总是通过引用进行比较。

      【讨论】:

        【解决方案5】:

        当您将对象或数组从一个变量分配给另一个变量时,它会复制对原始对象的引用,因此这两个对象是相等的。

        每次你写一个对象或数组字面量时,它都会创建一个不同的对象或数组,所以它们不相等,即使内容相似。

        【讨论】:

          【解决方案6】:

          当您以这种方式创建对象时,您就创建了一个地图。 地图的价值与原始类型不同。 所以 equals 只会检查引用相等。因此这失败了。 在第二种情况下,引用相等通过。

          【讨论】:

            【解决方案7】:

            根据 JavaScript 中的定义,两个不同的对象不能彼此相等。相同的属性和值并不重要。他们有不同的指针(第一个例子)。

            在第二个示例中,您正在使用引用克隆对象。所以“===”将返回true。

            【讨论】:

              【解决方案8】:

              在您的第一个示例中,您创建了两个具有任意内容的不同对象,它们随机相同:{same:'test'}{same:'test'}

              在第二个示例中,您只创建了一个对象,并将其存储在两个变量中:object1object2

              === 检查对象身份,这意味着比较变量中的对象必须相同。

              【讨论】:

              • == 也返回 false。在浏览器控制台中尝试:({x:'a'} == {x:'a'})
              • =====操作符的区别在于前者做类型强制,而后者做严格比较(类型值;对象的值恰好是他们的参考)
              • JavaScript 中有没有预定义的东西来检查对象是否相等?
              • 没有预定义。您可以找到一些用户编写的函数来检查这一点。一个简单的解决方法(忽略函数并在不同排序的字段上中断)是对两个对象进行 JSON 字符串化,然后比较结果字符串。
              • +1,因为这是唯一包含单词 identity 的答案。
              【解决方案9】:

              您的示例与 == 与 === 运算符的区别无关。正如人们之前解释的那样,您的示例只是创建了两个不同的对象,并且在下一个示例中引用了相同的对象。 == 和 === 在那里的作用相同。

              由于对象 litterals 始终是对象 litterals 并且不能以任何方式隐式转换,因此 == 和 === 对对象 litterals 的作用始终相同。其他一些类型,如 NaN、null 等,与 == 和 === 进行比较时会得到奇怪/有趣的结果

              【讨论】:

                【解决方案10】:

                这是 javascript 处理和比较对象的方式:

                【讨论】:

                  猜你喜欢
                  • 2014-07-28
                  • 1970-01-01
                  • 2017-09-29
                  • 2021-09-15
                  • 1970-01-01
                  相关资源
                  最近更新 更多