Size: a a a

2019 May 27

p

p0rsche in javascript_ru
[object Object]
под фулстэком ты подразумеваешь прогера?
Все как в статье выше
источник

S

Stepanyan in javascript_ru
ребят кто может обьяснить, такая конструкция const a = [...b]; не связывает а с b, то есть у них будут разные ссылки. но если b состоит из обьектов и если менять свойство одного обьекта b, то поменяется и a
источник

S

Stepanyan in javascript_ru
источник

AK

Andrey Karepin in javascript_ru
и?
источник

AK

Andrey Karepin in javascript_ru
что конкретно вызывает непонимаение?
источник

S

Stepanyan in javascript_ru
почему так ? ссылка массива меняется но ссылка на обьекти остается ?
источник

AK

Andrey Karepin in javascript_ru
естественно
источник

AK

Andrey Karepin in javascript_ru
ты создал новый массив из элементов старого
источник

S

Stepanyan in javascript_ru
то есть при спреде меняется ссылка на массив, но ссылки обьектов в массиве остаются, так ?
источник

p

p0rsche in javascript_ru
При спреде создаётся новый массив из элементов старого в твоём случае
источник

p

p0rsche in javascript_ru
Если бы там были элементарные типы, они бы скопировались
источник

p

p0rsche in javascript_ru
Но там объекты, а они передаются ссылками
источник

AK

Andrey Karepin in javascript_ru
я же тоже самое написал
источник

p

p0rsche in javascript_ru
У меня возникло ощущение, что человек все равно не понял
источник

p

p0rsche in javascript_ru
Там дело вообще не в спреде как таковом
источник

S

Stepanyan in javascript_ru
спасибо
источник

₹-SanyoK-₹ in javascript_ru
https://scotch.io/bar-talk/copying-objects-in-javascript
На счёт копирывания обьектов - Вот эта статейка может помочь
источник

К

Константин in javascript_ru
Простой способ - json и обратно
источник

[

[object Object] in javascript_ru
Stepanyan
то есть при спреде меняется ссылка на массив, но ссылки обьектов в массиве остаются, так ?
Есть такие понятия, как глубокое копирование и поверхностное копирование. Эти понятия есть не только в JS, но и в других языках, например в C++.
В JS за кулисами, когда ты создаешь массив и сохраняешь в него какие-то элементы, ты можешь представить это в памяти следующим образом:

Код:
const arr = [1, 2, 3, 4, 5, 6];

В памяти:
Переменная             Массив
  [x]
                ->        [x, x, x, x, x, x]

Это очень грубое представление, но суть в том, что ты должен представлять переменную и массив отдельно друг от друга в физической памяти. Переменная содержит ссылку (адрес) на массив, а массив же хранится где-то в другой части памяти. Когда ты пытаешься считать данные из переменной arr, то происходит переход по ссылке, которая содержится в переменной, чтобы найти в памяти данные массива.

Теперь, когда ты создаешь еще одну переменную arr2, и сохраняешь в нее arr, то на самом деле копируются не данные массива, а только ссылка. В итоге получаем:
Код:
const arr  = [1, 2, 3, 4, 5, 6];
const arr2 = arr;

В памяти:
Переменная             Массив
 [x]
, [x]         ->        [x, x, x, x, x, x]
     

В памяти добавилась новая переменная, а массив остался тот же. Обе меременные содержат один и тот же адрес в памяти. Это называется поверхностное копирование.
Если бы мы сделали глубокое копирование, то картина была бы следующая:
В памяти:
Переменная             Массив
  [x]
            ->        [x, x, x, x, x, x]
  [x]
            ->        [x, x, x, x, x, x]

Как делать глубокое копирование ищи уже сам.
источник

[

[object Object] in javascript_ru
Stepanyan
то есть при спреде меняется ссылка на массив, но ссылки обьектов в массиве остаются, так ?
Когда ты делаешь:
const a = [...b];

то по сути это тоже самое, что и:
const b = [1, 2, 3, 4];
const a = [];


a[0] = b[0];
a[1] = b[1];
a[2] = b[2];
a[3] = b[3];


И если в массив состоит из объектов, то ты просто копируешь их адреса (ссылки) из одного массива в другой.
источник