您好我有一个JSON对象
var A = {"Name:""Abd'Allah", "Age":43, "Homeland":"Australia"};
现在我复制到B并添加/删除/修改一些属性
var B = A;
delete B.Homeland;
现在问题是当我从B中删除了值时,它也从A中删除了。为什么?如何复制JSON变量?
目前我正在做的是
var B = JSON.parse(JSON.stringify(A));
但这有点愚蠢。做正确的方法是什么?
答案 0 :(得分:4)
通常,最好的方法是:
var B = Object.create(A)
之后,无论你想要什么,你都可以用B做,A不会被改变(但反之并非总是如此)。
它不是真正复制对象(它会设置原型链),但请检查它是否适合您。
答案 1 :(得分:2)
在javascript中分配对象或数组不会复制。当你这样做
var B = A;
现在你只需要两个指向同一个对象的变量。如果您修改该对象(通过任一变量),则只有一个对象,因此对该对象的引用都将看到更改。
如果你想在javascript中复制一个对象,只需将所有属性从一个对象复制到另一个对象,就可以制作一个浅层副本:
function shallowCopy(obj) {
var newObj = {};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
newObj[prop] = obj[prop];
}
}
return newObj;
}
注意,这是一个浅拷贝。如果属性本身包含其他对象,那么这将不会创建那些对象的新副本(它只会复制对它们的引用)。
通过更多的工作,您还可以进行深层复制,它将复制对象中包含的对象。这个函数唯一的问题是你必须确保没有循环引用,其中A
包含一个属性,该属性包含一个也包含A
的对象或数组,因为如果存在循环参考。
function deepCopy(obj) {
if (typeof obj !== "object" || obj === null) {
return obj;
}
var newObj = obj instanceof Array ? [] : {};
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
newObj[prop] = deepCopy(obj[prop]);
}
}
return newObj;
}
此函数不保留非普通对象的对象类型(当然,您的JSON解决方案也不保留)。要做到这一点,需要更多涉及构造函数的工作。