【问题标题】:why is an identical array not equivalent?为什么相同的数组不等价?
【发布时间】:2018-01-16 11:44:13
【问题描述】:

例如

$  node
> [1, 2, 3] == [1, 2, 3]
false

抱歉,如果我错误地使用了“相同”和“等效”。

console.log([1, 2, 3] == [1, 2, 3]);

我问,因为我习惯了 Ruby 之类的语言

$  irb
irb(main):001:0> [1,2,3] == [1,2,3]
=> true

...或 Python

$  python
>>> [1,2,3] == [1,2,3]
True

... double equals 是比较表达式的值

【问题讨论】:

    标签: javascript arrays comparison operators


    【解决方案1】:

    因为虽然它们可能具有相同的内容,但它们并不指向内存中的相同引用。

    为了更精确,想象一下下面的例子

    let arr1 = [1,2,3]
    let arr2 = [1,2,3]
    arr1 == arr2 //false
    

    这是有道理的,因为这两个数组是不同的对象,即使它们具有相似的值,例如,如果我们这样做了

    arr1.push(4)
    

    只有 arr1 会改变。

    如果您正在寻找比较数组的解决方案,您可能会发现this thread 很有用。

    【讨论】:

      【解决方案2】:

      它们是内存中的不同位置。它们是两个完全不同的数组,只是恰好具有相同的值。

      就像说A和B都拿着3个苹果,他们是同一个人吗? A 不能是 B。

      【讨论】:

        【解决方案3】:

        这个 [1,2,3] 是一个数组对象。当你创建它时,你会得到一个对这个数组的引用,一个指向内存中某个位置的指针。通过调用 [1,2,3] 你创建了另一个数组,你会得到一个完全不同的引用,一个指向内存中完全不同位置的指针。您在这两种情况下创建的数组包含相同的元素,为它们的创建保留了相同数量的内存,但它们实际上是两个完全不同的对象。

        两个对象之间的相等性基于比较它们的引用,如果它们相同,则引用指向同一个对象,因此== 运算符的评估是true。否则为false

        正如更正式的说法here

        平等(==)

        如果操作数不属于同一类型,则相等运算符会转换它们,然后应用严格比较。如果 两个操作数都是对象,然后当操作数引用同一个对象时,JavaScript 会比较相等的内部引用 记忆。

        【讨论】:

        • 谢谢 - 与其他语言相比,我必须阅读文档才能更好地了解 JS 的 =====
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多