【问题标题】:If b = [1, 2, 3, 4], and c = [...b], why doesn't b equal c?如果 b = [1, 2, 3, 4] 和 c = [...b],为什么 b 不等于 c?
【发布时间】:2018-06-22 21:55:14
【问题描述】:

标题几乎说明了一切,但在这里写出来:

b = [1, 2, 3, 4];
c = [...b];

b === c; //false

为什么?

【问题讨论】:

  • [] !== []。两个数组是两个唯一的对象。要进行比较,您需要迭代。
  • @elclanrs 对于专家来说,很明显这是上述问题的重复。对于提出问题的人来说,这是不同的:您可以看到这一点,因为链接页面上没有提到 ... 运算符。这很微妙,我可以看到它保持关闭或重新开放,但我的投票是重新开放。
  • @LeviMorrison 注意,展开语法... 不是运算符stackoverflow.com/questions/37151966/…
  • @guest271314 很公平;我在回答中引用了规范,所以我应该被挑剔。

标签: javascript arrays spread-syntax


【解决方案1】:

这就是常规数组identity / strict equality comparison 的工作原理。请记住,数组是对象:

严格等式比较算法

比较 x === y,其中 x 和 y 是值,产生真或假。这样的比较是这样进行的:

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 未定义,则返回 true。
  3. 如果 Type(x) 为 Null,则返回 true。
  4. 如果类型(x)是数字,那么
    • 如果 x 为 NaN,则返回 false。
    • 如果 y 是 NaN,则返回 false。
    • 如果 x 与 y 的数值相同,则返回 true。
    • 如果 x 为 +0 且 y 为 -0,则返回 true。
    • 如果 x 为 -0 且 y 为 +0,则返回 true。
    • 返回 false。
  5. 如果Type(x) 是String,那么如果x 和y 是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true;否则,返回 false。
  6. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回 false。
  7. 如果 x 和 y 引用同一个对象,则返回 true。否则,返回 false。

注意此算法与 SameValue 算法 (9.12) 的不同之处在于它对有符号零和 NaN 的处理。

... 没有影响。如果我们为两者分配相同的文字,我们可以看到:

b = [1, 2, 3, 4];
c = [1, 2, 3, 4];

b === c; //false

这是因为每个[] 都会创建一个新数组,即使它在其中使用了展开。

【讨论】:

    【解决方案2】:

    c 是一个新的Array 实例,不是同一个对象。

    您可以使用.every() 来检查索引b 处的每个元素是否与索引c 处的元素的值相同

    let bool = b.every((n, index) => c[index] === n)
    

    【讨论】:

    • 另见3.3.20.[SameObject]。例如const synth = window.speechSynthesis; window.speechSynthesis === synth // should always be true
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多