Если метод Array.prototype.slice() возвращает мелкую копию, почему изменение значения нарезанного массива не изменяет оригинал

#javascript

#javascript

Вопрос:

В документации по методу Array.prototype.slice() говорится

Метод slice() возвращает мелкую копию части массива в новый объект массива.

Если это так, почему изменение массива, возвращаемого Array.prototype.slice(), не изменяет исходное значение.

 > a = [1, 2, 3]
[ 1, 2, 3 ]
> b = a.slice(0)
[ 1, 2, 3 ]
> b[0] = 4
4
> b
[ 4, 2, 3 ]
> a // the expected output should be the same as output of b if b is shallowcopy of a.
[ 1, 2, 3 ]
  

Возможно, копирование при записи происходит при попытке изменить массив a. Если да, то технически правильно ли говорить, что Array.prototype.slice() возвращает мелкую копию.

Комментарии:

1. «почему изменение массива, возвращаемого Array.prototype.slice(), не изменяет исходное значение». Потому что это мелкая копия , как указано в документах, которые вы цитировали.

2. Этот вопрос кажется не по теме, потому что ожидаемый результат не является ожидаемым результатом.

3. @cookiemonster Тогда в документах не должно быть сказано, что он возвращает глубокую копию. Насколько я понимаю, изменение объекта мелкой копии изменит фактическое значение в ячейке памяти, на которую могут ссылаться многие объекты.

4. @Talespin_Kit: Если бы это было определение, это было бы бессмысленным упражнением. В итоге вы получите точно такой же массив. С таким же успехом можно просто сделать b = a . Я думаю, проблема может заключаться в том, что вы не понимаете семантику назначения объектов в JavaScript. Объекты являются ссылочными типами. То, что присваивается переменной, является ссылкой на объект, а не на сам объект. Это похоже на штучный указатель с ограниченными возможностями автоматического разыменования. Таким b = a; образом, создается копия ссылки, а не самого объекта / массива. А мелкая копия — это копия элементов на один уровень глубиной.

Ответ №1:

Результатом .slice является новый массив, это не указатель на начальную переменную.

Комментарии:

1. Чем термин мелкая копия в таком языке, как c , отличается от javascript. Я понимаю, что изменения, внесенные в мелкую копию, отражаются всеми объектами, на которые есть ссылка.

2. Я не знаю, почему у вас такое понимание. Копия — это именно то, на что это похоже, копия. Если вы думаете о указателе, это нормально… но это указатель.

3. В c , если объект содержит несколько ссылок на другие объекты, то копирование этих объектов также будет копировать ссылки, но даже это не относится к литералам

4. это ответило на ваш вопрос?