Как скопировать объект JavaScript в новую переменную не по ссылке? [дубликат]
этот вопрос уже есть ответ здесь:
- Каков наиболее эффективный способ глубокого клонирования объекта в JavaScript? 63 ответы
Я написал быстрый jsfiddle здесь, где я передаю небольшой объект json в новую переменную и изменяю данные из исходной переменной (не новая переменная), но данные новой переменной получает также обновляется. Это должно означать, что объект json был передан по ссылке, верно?
вот мой код:
var json_original = {one:'one', two:'two'}
var json_new = json_original;
console.log(json_original); //one, two
console.log(json_new); //one, two
json_original.one = 'two';
json_original.two = 'one';
console.log(json_original); //two, one
console.log(json_new); //two, one
есть ли способ сделать глубокую копию объекта json, чтобы изменение исходной переменной не изменяло новую переменную?
2 ответа:
Я обнаружил, что следующие работы, если вы не используете jQuery и заинтересованы только в клонировании простые объекты (см. комментарии).
JSON.parse(JSON.stringify(json_original));
ваш единственный вариант-каким-то образом клонировать объект.
посмотреть этот вопрос stackoverflow о том, как вы можете достичь этого.
для простых объектов JSON самым простым способом было бы:
var newObject = JSON.parse(JSON.stringify(oldObject));
если вы используете jQuery, вы можете использовать:
// Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject);
обновление 2017: я должен упомянуть, так как это популярный ответ, что теперь есть лучшие способы добиться этого с помощью новых версий javascript:
в ES6 или TypeScript (2.1+):
var shallowCopy = { ...oldObject }; var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" };
обратите внимание, что если
extraProp
также является свойством на oldObject, его значение не будет использоваться, потому чтоextraProp : "abc"
указано позже в выражении, которое по существу изменяет его. Конечно, oldObject не будет изменен.