@Omniverse

Как разобраться с передачей переменной в параметре функции?

Есть такой простой код:
let fruits = []

loadEntities(fruits, 'banana')
console.log(fruits)
loadEntities(fruits, 'apple')
console.log(fruits)

function loadEntities(entity, item) {
  entity = []
  entity.push(item)
}

Вывод:
[]
[]

Почему в данном случае выводится 2 пустых массива? Ведь в коде функции сначала массиву присваивается пустой массив, а потом добавляется значение.
Как сделать правильно, чтобы с каждым вызовом функции переменная очищалась и перезаписывалась новым значением.
  • Вопрос задан
  • 90 просмотров
Решения вопроса 3
Alexandroppolus
@Alexandroppolus
кодир
Никак. В JS нет передачи параметров по ссылке.

делай через return
fruits = loadEntities(''banana'')
Ответ написан
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
Почему в данном случае выводится 2 пустых массива? Ведь в коде функции сначала массиву присваивается пустой массив, а потом добавляется значение.

entity - это переменная внутри функции и существует она до окончания работы функции. Когда, функция вызывается, создается переменная entity и она содержит переданной значение (массив), далее вы просто перезаписываете эту функцию новым массивом и никаких изменений с изначально переданным массивом не происходит. Если убрать перезапись переменной новым массивом - то будет доступен переданный массив и его изменение. Проще всего представить, что переменная - это как коробка, в которую можно что-то положить. Если туда положить что-то новое - старое оттуда удалится.
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
В нерабочем коде создаётся новый массив – это новая область в памяти, новый объект.
Переменная entity внутри функции перестала указывать на тот же массив, что и fruits,
теперь указывает на новый пустой массив.
подробнее
function loadEntities(entity, item) {
  // тут entity из аргументов указывает туда же, куда и fruits
  // можно вызывать методы того, внешнего массива, Те же push(), splice()

  entity = []
  // а тут entity стала указывать в другую сторону, на новый пустой массив
  // fruits это уже никак не касается

  entity.push(item)
  // положили что-то в никчёмный массив
}


Вот рабочий вариант. Массив константа. Для его опустошения, длина устанавливается в 0.
const fruits = []; // навсегда

loadEntities(fruits, 'banana');
console.log(fruits);

loadEntities(fruits, 'apple');
console.log(fruits);

function loadEntities(entity, item) {
  entity.length = 0; // массив тот же, но пуст
  entity.push(item);
}

Альтернативный способ опустошить массив, сохранив его объект:
entity.splice(0, entity.length);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы