为什么我无法使用array == []检查数组是否为空?

时间:2017-06-06 04:56:40

标签: javascript arrays

这是来自CodeWars的一个问题,名为"正数的计数/负数的总和"。它说:

  

如果输入数组为空或null,则返回空数组

要检查数组是否为空,我决定检查它是否为空数组。当我尝试做的时候:

if(input == [])

我没有通过测试,但如果我做了:

if(input.length == 0)

我通过了考试。一个空数组应该等于[]对吗?为什么会有差异,这两个检查之间有什么区别?

我的代码如下:

function countPositivesSumNegatives(input) {
   var a = 0;
   var b = 0;
   if (input == null) {
      return []
   }
   if (input.length == 0) {
      return []
   }
   for (var i = 0; i < input.length; i++) {
      if (input[i] > 0) {
         a++;
      }
      if (input[i] < 0) {
         b += input[i];
      }
   }
   return [a, b]
}

2 个答案:

答案 0 :(得分:6)

问题是数组是对象。比较两个对象时,比较它们的引用。每the MDN documentation

  

平等(==)

     

如果两个操作数都是对象,则JavaScript会比较当操作数引用内存中相同对象时相等的内部引用。

由于两个数组实例不一定具有相同的引用,因此检查失败。只需在控制台中尝试:

> [] == []
false

两个看似具有相同内容(或缺少内容)的阵列并不相同。那是因为没有检查内容,而是参考。这两个数组是单独的实例,并引用内存中的不同位置,因此检查的结果为false。

另一方面,只检查长度,如果为零则检查数组是否为空。 length属性表示数组 1 中的内容量,并且是每个数组的一部分。由于它是每个数组的一部分并反映了数组中的数据量,因此您可以使用它来检查数组是否为空。

1 但请注意sparse arrays在评论中提到的RobG。可以使用new Array(N)创建此类数组,这将为您提供一个空数组,但长度为N。

答案 1 :(得分:0)

null没有长度

  if (input === null || input.length === 0 ) {
    return [];
    }