Почему существует связь между скопированными массивами?

Мне нужна помощь, чтобы понять, почему между массивами создаются отношения, когда я реплицирую массив по ссылке. Возьмем следующий пример:

let a = [1,2,3];
let b = a;
b.push(4);
console.info(b); // [1,2,3,4]
console.info(a); // [1,2,3,4]
a === b; // true

По какой-то причине {a} изменяется, когда я изменяю {b}, когда я ожидал, что они будут независимыми массивами.

По-видимому, такое отношение неверно для переменных. Возьмем следующий пример:

let a = 'test';
let b = a;
b = 'test1';
console.info(b); // "test1"
console.info(a); // "test"
a === b; // false

Кто-нибудь знает причину поведения массивов?

Это происходит потому, что массивы являются ссылочными типами в JavaScript. Это означает, что если вы присваиваете массив переменной или передаете массив функции, копируется или передается ссылка на исходный массив, а не значение массива.

Sani Singh Huttunen 10.04.2019 16:36

В javascript только примитивы "передаются по значению". Технически массивы точно не передаются по ссылке, однако вы можете считать, что все, что не является примитивом в javascript, «передается по ссылке».

briosheje 10.04.2019 16:36

Что произойдет, если вы замените a='test' на a=[1,2,3] во втором фрагменте?

georg 10.04.2019 16:39
a будет [1,2,3], а b будет "test1". b сначала будет указывать на a, затем он будет присвоен новой строке, поэтому будет потеряна ссылка, а не значение a.
briosheje 10.04.2019 16:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Массивы копируются по ссылке, поэтому, когда вы пишете:

let b = a;

Вы ссылаетесь на a в b.

Правильный способ:

let b = [...a]

или

let b = a.slice(0);

Другие вопросы по теме