Почему я не могу проверить, пуст ли массив с array == []?

это вопрос из 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]
}

1 ответов


проблема в том, что массивы объекты. Когда вы сравниваете два объекта, вы сравниваете их ссылки. Пер документация MDN:

равенство (==)

Если оба операнда являются объектами, затем JavaScript сравнивает внутренние ссылки, которые равны, когда операнды ссылаются на один и тот же объект в памяти.

поскольку два экземпляра массивов не обязательно имеют одну и ту же ссылку, проверка не удалась. Просто попробуйте это в консоли:

> [] == []
false

два массива, по-видимому, с одинаковым содержанием (или его отсутствием), не равны. Это потому, что контент не проверяется, а ссылка. Эти два массива являются отдельными экземплярами и ссылаются на разные места в памяти, поэтому проверка оценивается как false.

С другой стороны, просто проверяя длину, и если она равна нулю, проверяет, пуст ли массив или нет. The length свойство обозначает объем содержимого в массив1 и является частью каждого массива. Поскольку он является частью каждого массива и отражает объем данных в массиве, вы можете использовать его, чтобы проверить, пуст ли массив или нет.


1 остерегайтесь, однако,разреженные массивы как отметил RobG в комментариях. Такие массивы могут быть созданы с помощью new Array(N), который даст вам пустой массив, но с длиной Н.