JavaScript не нуждается в представлении, это надежный и универсальный язык, но если вы работали с ним, вы, вероятно, заметили некоторые необычные особенности его поведения. Один из них — то, как JavaScript обрабатывает копии переменных, особенно при работе с объектами. В этой статье мы рассмотрим концепцию глубокого копирования и то, как она помогает нам избежать неожиданных проблем при дублировании данных в наших программах.
Когда мы копируем переменную, JavaScript создает новое пространство памяти и сохраняет там скопированное значение; тогда новая переменная указывает на это новое пространство памяти. Например:
x = 5; y = x;
y указывает на новое пространство памяти, которое имеет то же значение, что и x, т.е. 5 . будет примерно так:
Приведенная выше концепция применима только к примитивным значениям, для объектов она другая. Представьте, что у нас есть следующие два объекта:
let a = { name: 'Rick', lastName: 'Sanchez', }; let b = a;
В приведенном выше примере b не имеет собственного пространства памяти, как можно было бы ожидать; вместо этого a указывает на область памяти, где хранится a.
Какие проблемы может вызвать такое поведение? По сути, если вы измените любое поле с a или b, обе переменные изменятся. Запустите следующий код и проверьте его самостоятельно.
let a = { name: 'Rick', lastName: 'Sanchez', }; let b = a; b.name = 'Morty'; console.log('a: ', a); // a: { name: 'Morty', lastName: 'Sanchez' } console.log('b: ', b); // b: { name: 'Morty', lastName: 'Sanchez' }
Решение этой проблемы? Нам нужно сделать глубокую копию, чтобы сохранить значение a в новом независимом пространстве памяти, на которое указывает b.
const b = JSON.parse(JSON.stringify(a));
Таким образом, мы заставляем JavaScript создать новое пространство памяти, изменив формат с Object на JSON. Это делается с помощью метода stringify, затем JSON с собственным пространством памяти преобразуется обратно в объект с помощью метода parse, поэтому обе переменные остаются полностью независимыми.
Случалось ли с вами когда-нибудь такое странное поведение? Дайте знать в комментариях, буду рада вас прочитать!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3