繁体   English   中英

Javascript 中的空数组不等于自身?

[英]Empty array does not equal itself in Javascript?

我遇到了[] == []在 Javascript 中为false的情况。

有人可以解释为什么吗?

对象按引用相等, []是新对象有新引用,右手的[]也是新对象有新引用,所以它们不相等,就像:

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

考虑以下两种情况:

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

在这里,创建了两个不同的对象,并且在不同的内存位置创建的这两个不同的实例永远不会相同(对象实例比较比较内存地址) 结果输出false

但,

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

在这里, ["foo"]对象类型被隐式转换为primitive type 现在右侧的"foo"string ,因此它尝试将其转换为string.toString(), since double equals allows coercion )并比较"foo" == "foo" ,这是true

结论:我们通过内存指针/地址或者我们可以说引用来比较对象实例,通过实际值比较来比较原始类型。

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

请参阅对象标识,因为两个数组都创建了一个新的数组实例,因此比较两个不同的对象是不相等的。 您的代码相当于:

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

两个文字总是评估为两个不同的实例,它们不被认为是相等的。

我实际上在任何地方都找不到测试对象是否是长度数组(例如空数组)的代码,所以如果有人以后想要的话,我很快就写了它:

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM