最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Why can't I check if an array is empty with array == []? - Stack Overflow

programmeradmin6浏览0评论

This is a question from CodeWars that is named "Count of positives/sum of negatives". It says:

If the input array is empty or null, return an empty array

To check if the array is empty, I decided to check if it was an empty array. When I try to do:

if(input == [])

I fail the test, but if I do:

if(input.length == 0)

I pass the test. An empty array should be equal to [] right? Why is there a difference, and what is the difference between these two checks?

My code is as follows:

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]
}

This is a question from CodeWars that is named "Count of positives/sum of negatives". It says:

If the input array is empty or null, return an empty array

To check if the array is empty, I decided to check if it was an empty array. When I try to do:

if(input == [])

I fail the test, but if I do:

if(input.length == 0)

I pass the test. An empty array should be equal to [] right? Why is there a difference, and what is the difference between these two checks?

My code is as follows:

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]
}
Share Improve this question edited Jun 6, 2017 at 5:11 Andrew Li 58k14 gold badges134 silver badges148 bronze badges asked Jun 6, 2017 at 4:56 EllenEllen 754 bronze badges 7
  • 1 Have you ever tried [] == [] in the console? – Andrew Li Commented Jun 6, 2017 at 4:59
  • 1 Try 0 == [] and "" == []. Both evaluate to true. – user94559 Commented Jun 6, 2017 at 4:59
  • put first line of method, input = input || []; and you would save lot of conditions. – A.T. Commented Jun 6, 2017 at 5:00
  • 3 Before you consider downvoting, this question does in fact show a proper amount of research and effort. Just because you think the answer is easy doesn't necessarily mean it is. JavaScript equalities can be notoriously tricky, so cut new developers a little slack. – Patrick Roberts Commented Jun 6, 2017 at 5:00
  • It is like paring two empty boxes. Empty box in your left hand looks just like empty box in your right hand, but they are not the same object. However, they are both empty (length is 0). – Yeldar Kurmangaliyev Commented Jun 6, 2017 at 5:59
 |  Show 2 more ments

3 Answers 3

Reset to default 8

The problem is that arrays are objects. When you pare two objects, you pare their references. Per the MDN documentation:

Equality (==)

If both operands are objects, then JavaScript pares internal references which are equal when operands refer to the same object in memory.

Since two instances of arrays don't necessarily have the same reference, the check fails. Just try this in the console:

> [] == []
false

Two arrays seemingly with the same content (or lack thereof) are not equal. That's because content is not checked, but reference. These two arrays are separate instances and refer to different places in memory, thus the check evaluates to false.

On the other hand, just checking the length, and if it is zero checks if the array is empty or not. The length property signifies the amount of content in an array1 and is part of every array. Since it is part of every array and reflects the amount of data in the array, you can use it to check if the array is empty or not.


1 Beware, though, of sparse arrays as mentioned by RobG in the ments. Such arrays can be created with new Array(N) which will give you an empty array, but with length N.

null has no length

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

 if (input == null || input.Length == 0)
       return res2;

This code will solve your problem

发布评论

评论列表(0)

  1. 暂无评论