#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. это ответило на ваш вопрос?