Spreading создает мелкую копию? - PullRequest
0 голосов
/ 26 апреля 2018

В соответствии с приведенным примером здесь ,

let first:number[] = [1, 2];
let second:number[] = [3, 4];

let both_plus:number[] = [0, ...first, ...second, 5];
console.log(`both_plus is ${both_plus}`);
first[0] = 20;
console.log(`first is ${first}`);
console.log(`both_plus is ${both_plus}`);
both_plus[1]=30;
console.log(`first is ${first}`);
console.log(`both_plus is ${both_plus}`);

Распространение показывает глубокую копию, потому что все три массива имеют свои собственные дубликаты, основанные на выводе ниже:

both_plus is 0,1,2,3,4,5
first is 20,2
both_plus is 0,1,2,3,4,5
first is 20,2
both_plus is 0,30,2,3,4,5

Документация говорит: Распространение создает неглубокую копию first и second. Как я понимаю это?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

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

Javascript передается по значению, поэтому когда копируется массив (например, с использованием распространения), каждое значение в исходном массиве копируется в новый массив. В случае примитива значение копируется напрямую, и сделанные в нем изменения не влияют на оригинал.

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

Вот пример:

const objArray = [{foo: "bar"}];
const shallowCopy = [...objArray];

// Changing the array itself does not change the orignal. Note the
// original still only has one item, but the copy has two:
shallowCopy.push({foo: "baz"});
console.log("objArray after push:", objArray);
console.log("shallowCopy after push:", shallowCopy);

// However, since shallowCopy[0] is a reference pointing to the same object
// as objArray[0], mutating either will change the other:
shallowCopy[0].foo = "something else";
console.log("objArray after mutation:", objArray);
console.log("shallowCopy after mutation:", shallowCopy);
0 голосов
/ 26 апреля 2018

Мелкая копия означает, что все элементы из first и second просто добавляются в новый массив, новую копию. Глубокое копирование будет означать, что все элементы из first и second сначала копируются, а затем добавляются в новый массив.

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

Используя примитивы, такие как числа, на самом деле невозможно проиллюстрировать разницу, но если вы используете объекты, разница довольно очевидна.

Скажем, у вас есть что-то вроде этого:

let first = [{foo: 'bar'}];
let second = [{fizz: 'buzz'}];
let both = [...first, ...second];

Поскольку распространение результатов в мелкой копии позволяет ожидать, что соответствующие объекты пройдут тест на равенство:

first[0] === both[0]; // true
second[0] === both[1]; // true

Но если распространение привело к глубокому копированию, можно ожидать, что тест на равенство не пройдёт:

first[0] === both[0]; // false
second[0] === both[1]; // false
...