如果 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 的最后结果 顺便把运算符的优先级告诉哈我 谢谢