Почему я не могу проверить, пуст ли массив с 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)
, который даст вам пустой массив, но с длиной Н.