空数组在Javascript中不等于自己?

时间:2014-04-21 09:29:54

标签: javascript

我遇到过Javascript中[] == []false的情况。

有人可以解释原因吗?

5 个答案:

答案 0 :(得分:9)

对象通过引用相等,[]是带有新引用的新对象,右手[]也是带有新引用的全新对象,因此它们不相等,就像:

var user1 = new User();
var user2 = new User();
user1 === user2; // Never true

答案 1 :(得分:3)

请考虑以下两种情况:

[] == []; // returns false
["foo"] == ["foo"]; //returns false

这里创建了两个不同的对象,这两个不同的实例永远不会相同,导致输出错误。

但是,

["foo"] == "foo"; // returns true

这里,[“foo”]对象类型隐式转换为私有类型,现在即字符串(.toString(), since double equals allows coercion)和比较"foo" == "foo",这是真的。

答案 2 :(得分:2)

因为它们不是同一个对象,所以不同的对象永远不会相等,所以结果是false

答案 3 :(得分:0)

See Object identity因为两个数组都创建了一个新的数组实例,所以比较两个不同的对象是不相等的。您的代码相当于:

var arr1 = [],
    arr2 = [];
arr1 == arr2; // false    

两个文字总是评估为两个不同的实例,这些实例不相同。

答案 4 :(得分:0)

我实际上找不到代码来测试一个对象是否是一个长度数组(例如空数组),所以如果有人想要它,我写得很快:

  function isArrayOfLength(obj, length) {
    var isArrayOfSpecifiedLength = false; 

    if(Array.isArray(obj)){ 
      if(obj.length === length){
        isArrayOfSpecifiedLength = true; 
      }
    }

    return isArrayOfSpecifiedLength; 
  }

对它的测试:

  (function(){
    var isValidArray = isArrayOfLength([], 0); 
    console.log(isValidArray); //true
  })(); 

  (function(){
    var isValidArray = isArrayOfLength([1,2,3], 0);
    console.log(isValidArray); //false
  })(); 

  (function(){
    var isValidArray = isArrayOfLength([1,2,3], 3);
    console.log(isValidArray); //true
  })(); 

  (function(){
    var isValidArray = isArrayOfLength({notAnArray:true}, 0);
    console.log(isValidArray); //false
  })(); 

https://plnkr.co/edit/sjgnVoNAI0KUNCwhbdpx?p=preview