Почему JS не предоставляет простой способ выполнить глубокое копирование объектов? - PullRequest
1 голос
/ 09 января 2020

Как кто-то привык к python и C ++, наличие = копировать объекты по ссылке, а не по значению совсем не интуитивно понятно. Не только это, но, похоже, не существует прямого способа копирования объектов для начала. JSON.parse(JSON.stringify) - самый близкий вариант (если я правильно знаю), и даже у него есть проблемы.

a) В языке, где все переменные в любом случае рассматриваются как объекты, почему оператор = различает guish между примитивными и не примитивными типами данных, чтобы решить, следует ли копировать по значению или ссылка?

б) Почему копирование по значению невозможно для объектов?

c) Какие методы полезны для новичка, привыкшего копировать объекты по значению в код без него?

1 Ответ

3 голосов
/ 09 января 2020

а) На языке, где все переменные в любом случае рассматриваются как объекты, почему оператор = различается guish [...]?

* 1005 Оператор * (назначить) не различает guish между примитивными и не примитивными типами данных. Это делает то же самое для обоих, учитывая, что равенство сохраняется после присваивания (исключая исключения, например NaN, ...).

b) Почему копирование по значению невозможно для объектов?

Неправильное предположение в а) приводит к этому. Назначение не является копией и копия объекта не сохраняет равенство.

Или подумайте: var obj = {a: {b: 1}}.

Что такое значение из obj.a? Это просто ссылка на {b:1}.

c) Какие приемы полезны для начинающего, который привык копировать объекты по значению в код без него?

Есть много подходов к этому. И два тривиальных случая.

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

В качестве второго случая предполагается использование объекта cycli c, содержащего все возможное в javascript (функции, регулярные выражения, символы, неопределенные,. ..) глубины n и строит что-то (не json.stringify).

Для начала: возможный дубликат


Допущения:

примитивные и не примитивные типы данных имеют по умолчанию getter, setter, ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...