Ответ 1
Я обнаружил, что следующее работает, если вы не используете jQuery и заинтересованы только в клонировании простых объектов (см. Комментарии).
JSON.parse(JSON.stringify(json_original));
Документация
Я написал быстрое 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, чтобы изменение исходной переменной не изменило новую переменную?
Я обнаружил, что следующее работает, если вы не используете jQuery и заинтересованы только в клонировании простых объектов (см. Комментарии).
JSON.parse(JSON.stringify(json_original));
Документация
Ваш единственный способ - клонировать объект.
См. fooobar.com/info/97/... о том, как вы можете это достичь.
Для простых объектов 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 не будет изменен.