Нуждаюсь в пояснении [не срабатывает сравнение массивов?]

Есть функция которая должна вывести сумму элементов массива.

function productOfArray(arr) {
let multiplication;
if (arr === [] || arr === [0]) { // пустой массив или 0 в массиве выводит 0
multiplication = 0;
} else {
multiplication = 1; // если нет то 1
}
for (let i = 0; i < arr.length; i++) // перебор массива
multiplication *= arr[i]; // перезапись результата суммирования
console.log(multiplication);
return multiplication;
}
productOfArray(arr)
Есть дополнительное условие :

  • должен выводиться  "0"  при пустом массиве;
    
  • должен выводиться  "0" при   [0];
    

Подскажите младенцу где я накосячил ? На [] выводит 1;

Массив — это объект. Сравнение объектов происходит по их указателю, а не их содержимому.

1 лайк

А разве здесь сравнение , а не ИЛИ ?
ЕСЛИ arr === 0 ИЛИ arr [] ТО mult = 0; Если ЛОЖЬ то mult = 1

А разве здесь сравнение , а не ИЛИ ?
ЕСЛИ arr === 0 ИЛИ arr [] ТО mult = 0; Если ЛОЖЬ то mult = 1

Речь идёт не про ||, а попытку сравнения (равенства) через ===. Попробуйте в консоли написать маленький кусочек кода и запустите его:

const arr1 = [];
const arr2 = [];
console.log(arr1 === arr2);

Вы увидите, что будет false - независимо от того, строгое будет равенство или нет. Массив создаётся в куче (неструктурированной области памяти). Управляете Вы им через переменную. Поэтому в Вашем случае переданный для сравнения массив слева от равенства - это отдельный массив в куче, а справа от равенства - ещё один отдельный массив в куче. И они никогда не будут равны между собой, т.к. это разные массивы.

Написав let arr = [], Вы создали массив в куче. Управляете Вы им через ссылку, которая записана в переменную arr. Если Вы решили переопределить переменную let arr = null, например, всё: связь с этим массивом потеряна навсегда - он больше не доступен для Ваших действий с ним. Он полежит в куче некоторое время, а потом будет уничтожен. А если Вы передумали и напишете let arr = [], то это создаст абсолютно новый массив, хоть с виду он кажется и таким же. Но это совсем другой массив, а не тот, который был создан изначально. Поэтому 2 одинаковых массива никогда не равны между собой в JS.

Может, поможет такое сравнениие: два абсолютно идентичных автомобиля VW с электронными ключами. Вы никогда не откроете одним ключом обе машины. Каждый ключ для своего VW. Так вот ключ - это ссылка на массив (ссылка на свой VW), а VW - это соответствующий массив. Сравнение массивов в JS идёт по ссылке, т.е. сравниваются cсылки в переменных (ключи в нашем примере. А они разные - каждый ключ для своей машины. Поэтому и VW, пусть и идентичной комплектации и модели, будут “не равны” между собой).

Наличие элементов в массиве можно проверить через arr.length === 0 (или !arr.length), а наличие единственного элемента нуля - arr.length === 1 && arr[0] === 0. Тогда должно всё заработать.

Да, и ещё не понимаю, зачем в коде ветка с else 1-й? Если Вы передаёте в функцию НЕпустой массив и единственный элемент в нём отличен от 0, то, как я понимаю, нужно вернуть сумму элементов массива. Т.е. при коррректно работающей функции 1 никогда не будет возвращена! Или нет? )

3 лайка

Речь про это сравнение. Оно не работает так как ты ожидаешь. Ниже хорошо детально расписали почему так. Проверь рабочесть подобного кода: [] === [] // false, а судя по коду то ожидается что [] === [] должно быть true. Та же истори с массивом с элементами [0] === [0] // false.

1 лайк

У меня не совсем ответ а больше вопрос , тогда будет правильно заменить проверку arr === [] на arr.length === 0, а вот как лучше заменить это arr === [0] ? Наверно это условие можно заменить так array.includes(0) . И еще вопрос я не очень понял условие и ее решение - написано Есть функция которая должна вывести сумму элементов массива. Но при этом внутри ме не суммируем а делаем multiplication *= arr[i]; Зачем и для чего ? я не понял.

1 лайк

Точный эквивалент того что имеется в виду в коде arr === [0] это arr.length === 0 && arr[0] === 0.

Верно описываешь: этот код не соответствует декларируемым целям. Код перемножает элементы массива, а должен бы суммировать.


Это классическая ситуация когда человек только начинает писать программы. Всегда в начале делается куча ошибок в однок программе которые переплетаются и мешают разобраться с каждой из них в отдельности. С опытом приходит навык выделения работающих кусков кода, и тогда имеешь дело уже с изолированными ошибками.

3 лайка

Спасибо всем участвовавшим в обсуждении. Немного сбился в описании (выполнял несколько разных задач одновременно), в функции действительно ‘multiplication’.
‘Alex_March’ и ‘dmitry’ вам огромное спасибо, подсказки подтолкнули к решению. Респект.

3 лайка