Задать вопрос
kamaltdin
@kamaltdin
Изучающий программирование,в данный момент node.js

Можно ли переменной, ссылающейся на массив, присвоить метод slice того же массива? Тут не будет ошибки и старый массив продолжит существование?

var array = [1];
var collection = [];
collection.push(array);
array = array.slice();
array[1] = 2;

Старый массив нормально продолжит существование в collection во всех браузерах? Тут нет ошибки? Новый массив также будет нормальным рабочим массивом? В общем можно ли так делать или такой метод программирования может иметь в виде последствия проблемы?
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Новый массив нормальный, да. Старый массив продолжит существовать пока на него есть ссылки. Если на него никто не ссылается, то он еще чуток поживет, а потом его сборщик мусора удалит.

В вашем примере на него ссылается collection, но если удалить collection, то и старый массив удалится.

Вот вам такой примерчик:
А разгадка простая:

В этом примере всего два массива. Первый, который [1,2,3], и второй, который создается при вызове slice.

Три переменные с именами a, b, c, которые ссылаются сперва на один и тот-же массив, затем переменная a ссылается на тот, который создан при помощи slice.
И после изменения первоначального массива (b[1] = 'bar') этот измененный массив продолжает быть доступным по переменным b и c.
Ответ написан
@kuftachev
Самый простой способ узнать это, просто проверить, если есть сомнения.

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

Типа map(), forEach(), filter(), reduce().

Также разберитесь когда передается ссылка, а когда значение, чтобы хотя бы понимать, что это разные вещи и когда будет что-то не получается, может оказаться, что забыли именно это.

Ещё почитайте о порядке вычисления выражений, в данном случае, очевидно, что сначала вычислиться функция, потом ее значение провалится тому, что справа.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы