如果 b = [1, 2, 3, 4] 和 c = [...b],为啥 b 不等于 c?

Posted

技术标签:

【中文标题】如果 b = [1, 2, 3, 4] 和 c = [...b],为啥 b 不等于 c?【英文标题】: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 注意,展开语法... 不是运算符***.com/questions/37151966/… @guest271314 很公平;我在回答中引用了规范,所以我应该被挑剔。 【参考方案1】:

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

严格等式比较算法

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

    如果 Type(x) 与 Type(y) 不同,则返回 false。 如果 Type(x) 未定义,则返回 true。 如果 Type(x) 为 Null,则返回 true。 如果类型(x)是数字,那么 如果 x 为 NaN,则返回 false。 如果 y 是 NaN,则返回 false。 如果 x 与 y 的数值相同,则返回 true。 如果 x 为 +0 且 y 为 -0,则返回 true。 如果 x 为 -0 且 y 为 +0,则返回 true。 返回 false。 如果Type(x) 是String,那么如果x 和y 是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true;否则,返回 false。 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回 false。 如果 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

以上是关于如果 b = [1, 2, 3, 4] 和 c = [...b],为啥 b 不等于 c?的主要内容,如果未能解决你的问题,请参考以下文章

设a=2i-3j+k,b=i-j+3k,c=i-2j,求(a+b)x(b+c)

在C++中,a=4,b=10,c=2 计算:a+b*c/(a+c)%3/a 的最后结果 顺便把运算符的优先级告诉哈我 谢谢

sql in用法

js一维数组转多维数组?

取嵌套列表中的元素

对数组对象进行分类