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

时间:2018-01-13 18:46:34

标签: javascript arrays spread-syntax

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

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

b === c; //false

为什么?

2 个答案:

答案 0 :(得分:4)

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

  

严格的等式比较算法

     

比较x === y,其中x和y是值,产生true或false。这样的比较如下进行:

     
      
  1. 如果Type(x)与Type(y)不同,则返回false。
  2.   
  3. 如果Type(x)为Undefined,则返回true。
  4.   
  5. 如果Type(x)为Null,则返回true。
  6.   
  7. 如果Type(x)是Number,那么      
        
    • 如果x为NaN,则返回false。
    •   
    • 如果y为NaN,则返回false。
    •   
    • 如果x与y的数字值相同,则返回true。
    •   
    • 如果x为+0且y为-0,则返回true。
    •   
    • 如果x为-0且y为+0,则返回true。
    •   
    • 返回false。
    •   
  8.   
  9. 如果Type(x)是String,则如果x和y完全相同的字符序列(相应位置的长度和字符相同),则返回true;否则,返回false。
  10.   
  11. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true;否则,返回false。
  12.   
  13. 如果x和y引用同一个对象,则返回true。否则,返回false。
  14.         

    注意此算法在处理带符号的零和NaN时与SameValue算法(9.12)不同。

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

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

b === c; //false

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

答案 1 :(得分:1)

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

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

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