[]与[]不同

时间:2013-12-09 15:12:22

标签: javascript arrays empy

我被要求在Javascript中编写一个函数sortByFoo,它会对此测试做出正确的反应:

// Does not crash on an empty array
console.log(sortByFoo([]) === []);

但我尝试了一些事情:

[] === [];
>> false

这样我可以肯定,这样的测试总会失败,无论sortByFoo函数如何,都不会吗? 但我想解释为什么会发生这种情况。为什么[]不等于[]?

请原谅我的近似英语,这不是我的母语:p

4 个答案:

答案 0 :(得分:4)

如果你看一下javascript / ecmascript的规范,特别是section 11.9.6,你会看到如何与===进行比较。

  

严格的等式比较算法

     

比较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.   

由于你的数组一直到第七步,它们必须是同一个对象,而不仅仅是两个相同的对象。对于常规等式运算符(==)也是如此。

答案 1 :(得分:3)

因为每次编写[]时都会调用数组的构造函数。

[]new Array()相同,在Javascript中,与equals方法相比较的新对象不同。使用new Object()时,请reference,{}相同。

答案 2 :(得分:2)

执行[] === []时,您要比较参考而不是值(或按值进行深度比较)。

看一下这个javascript数组比较解决方案:Comparing two arrays in Javascript

答案 3 :(得分:1)

是的,你是对的,两个数组文字永远不会相等。那是因为它们引用了两个独立的数组实例。

应该写下描述测试的代码:

var arr = [];
var result = sortByFoo(arr);
console.log(result === arr && result.length == 0);

检查函数返回的引用是否与发送的引用相同,并且该数组仍然为空,确保该函数返回相同的数组不变。