В чем разница между мелкой копией и глубокой копией с массивами JavaScript?
В соответствии с документацией MDN вызов array.slice()
создаст мелкую копию массива.
Смотрите ссылка MDN для slice().
Однако, если я запускаю простой тест как таковой в консоли:
var test = [[1,2,3],7,8,9];
var shallow_copy = test.slice();
и проверите мелкую_копию, я вижу, что весь 2-мерный массив, кажется, скопирован.
В чем разница между мелкой копией и глубокой копией? Если бы я догадался, я бы назвал это глубокой копией.
Ответы
Ответ 1
Чтобы увидеть разницу, попробуйте:
shallow_copy[0][2] = 4;
console.dir(test);
Вы увидите, что test
было изменено! Это связано с тем, что, хотя вы, возможно, скопировали значения в новый массив, вложенный массив все тот же.
Глубокая копия будет рекурсивно выполнять мелкие копии, пока все не станет новой копией оригинала.
Ответ 2
В основном вы просто получаете ссылку на исходную переменную/массив. Изменение ссылки также изменит исходный массив. Вам нужно перебрать значения исходного массива и сформировать копию.
Рассмотрим следующий пример:
var orig = { a: 'A', b: 'B', c: 'C' };
Предположим, вы хотите создать дубликат этого, так что даже если вы измените исходные значения, вы всегда можете вернуться к оригиналу.
Я могу это сделать:
var dup = orig; //Shallow copy!
Если мы изменим значение:
dup.a = 'Apple';
Этот оператор также изменит a
на orig
, так как у нас есть мелкая копия или ссылка на var orig
. Это означает, что вы также теряете исходные данные.
Но, создав новую переменную, используя свойства исходной переменной orig
, вы можете создать глубокую копию.
var dup = { a: orig.a, b: orig.b, c: orig.c }; //Deep copy!
Теперь, если вы измените dup.a
, это затронет только dup
, а не orig
.