修改JavaScript对象的副本会导致原始对象发生更改

修改JavaScript对象的副本会导致原始对象发生更改,javascript,object,copy,Javascript,Object,Copy,我正在将objA复制到objB const objA = { prop: 1 }, const objB = objA; objB.prop = 2; console.log(objA.prop); // logs 2 instead of 1 阵列也有同样的问题 const arrA = [1, 2, 3], const arrB = arrA; arrB.push(4); console.log(arrA.length); // `arrA` has 4 elements ins

我正在将
objA
复制到
objB

const objA = { prop: 1 }, 
const objB = objA; 
objB.prop = 2;
console.log(objA.prop); // logs 2 instead of 1
阵列也有同样的问题

const arrA = [1, 2, 3], 
const arrB = arrA; 
arrB.push(4); 
console.log(arrA.length); // `arrA` has 4 elements instead of 3.
尝试使用:

但是,如果要保留这两个原始对象,请 可以通过将空对象作为目标传递来执行此操作:

var object=$.extend({},object1,object2)


尝试使用:

但是,如果要保留这两个原始对象,请 可以通过将空对象作为目标传递来执行此操作:

var object=$.extend({},object1,object2)



很明显,您对语句
var tempmoyobj=myObj可以

在JavaScript中,对象是通过引用传递和分配的(更准确地说是引用的值),因此
tempMyObj
myObj
都是对同一对象的引用

这里有一个简化的例子,可以帮助你想象正在发生的事情

// [Object1]<--------- myObj

var tempMyObj = myObj;

// [Object1]<--------- myObj
//         ^ 
//         |
//         ----------- tempMyObj
用香草JavaScript

function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

var newObject = clone(myObj);

请参见和

很明显,您对语句
var tempmoyobj=myObj可以

在JavaScript中,对象是通过引用传递和分配的(更准确地说是引用的值),因此
tempMyObj
myObj
都是对同一对象的引用

这里有一个简化的例子,可以帮助你想象正在发生的事情

// [Object1]<--------- myObj

var tempMyObj = myObj;

// [Object1]<--------- myObj
//         ^ 
//         |
//         ----------- tempMyObj
用香草JavaScript

function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

var newObject = clone(myObj);
请参见并尝试使用如下所述的create()方法

var tempMyObj = Object.create(myObj);
这将解决问题。

尝试使用如下所述的create()方法

var tempMyObj = Object.create(myObj);

这将解决问题。

这可能非常棘手,让我试着用一种简单的方式来解释。在javascript中将一个变量“复制”到另一个变量时,实际上并不是将其值从一个变量复制到另一个变量,而是为复制的变量指定一个对原始对象的引用。要实际制作副本,您需要创建一个新的对象以供使用

棘手的部分是,为复制的变量指定新值与修改其值之间存在差异。当为复制变量指定新值时,您正在摆脱引用并为副本指定新值,如果只修改副本的值(不指定新值),则修改的是副本和原件

希望这个例子有帮助

let original=“Apple”;
让copy1=copy2=original;
copy1=“香蕉”;
copy2=“John”;
log(“为复制的变量分配新值只会更改副本。ogrinal变量不会更改”);
控制台日志(原件);//苹果
console.log(copy1);//香蕉
console.log(copy2);//约翰
//----------------------------
原始={“水果”:“苹果”};
copy1=copy2=原件;
copy1={“动物”:“狗”};
copy2=“John”;
console.log(“\n将新值分配给复制的变量只会更改副本。ogrinal变量不会更改”);
控制台日志(原件)//{水果:'苹果'}
console.log(copy1);//{动物:“狗”}
console.log(copy2);//约翰*/
//----------------------------
//这是诀窍!!!!!!!
原始={“水果”:“苹果”};
让实拷贝={};
分配对象(真实副本、原件);
copy1=copy2=原件;
copy1[“水果”]=“香蕉”//我们没有给变量分配一个新的值,我们只是修改它,所以它会更改副本和原始值!!!!
copy2=“John”;
console.log(“\n修改变量而不为其分配新值,同时更改原始变量”)

控制台日志(原件)//{水果:'香蕉'}这可能非常棘手,让我试着用一种简单的方式来表达。在javascript中将一个变量“复制”到另一个变量时,实际上并不是将其值从一个变量复制到另一个变量,而是为复制的变量指定一个对原始对象的引用。要实际制作副本,您需要创建一个新的对象以供使用

棘手的部分是,为复制的变量指定新值与修改其值之间存在差异。当为复制变量指定新值时,您正在摆脱引用并为副本指定新值,如果只修改副本的值(不指定新值),则修改的是副本和原件

希望这个例子有帮助

let original=“Apple”;
让copy1=copy2=original;
copy1=“香蕉”;
copy2=“John”;
log(“为复制的变量分配新值只会更改副本。ogrinal变量不会更改”);
控制台日志(原件);//苹果
console.log(copy1);//香蕉
console.log(copy2);//约翰
//----------------------------
原始={“水果”:“苹果”};
copy1=copy2=原件;
copy1={“动物”:“狗”};
copy2=“John”;
console.log(“\n将新值分配给复制的变量只会更改副本。ogrinal变量不会更改”);
控制台日志(原件)//{水果:'苹果'}
console.log(copy1);//{动物:“狗”}
console.log(copy2);//约翰*/
//----------------------------
//这是诀窍!!!!!!!
原始={“水果”:“苹果”};
让实拷贝={};
分配对象(真实副本、原件);
copy1=copy2=原件;
copy1[“水果”]=“香蕉”//我们没有给变量分配一个新的值,我们只是修改它,所以它会更改副本和原始值!!!!
copy2=“John”;
console.log(“\n修改变量而不为其分配新值,同时更改原始变量”)

控制台日志(原件)//{fruit:'Banana'}带有JSON.parse()和JSON.stringify的深度克隆对象

// Deep Clone
obj = { a: 0 , b: { c: 0}};
let deepClone = JSON.parse(JSON.stringify(obj));
参考文献:


更好的参考

带有JSON.parse()和JSON.stringify的深度克隆对象

// Deep Clone
obj = { a: 0 , b: { c: 0}};
let deepClone = JSON.parse(JSON.stringify(obj));
参考文献:


更好的参考

如果您在数组方面有相同的问题,那么他
const a = {b: 1, c: 0};
let d = {...a};
string s = Serialize(object); //Serialize to JSON
//Deserialize to original object type
tempSearchRequest = JsonConvert.DeserializeObject<OriginalObjectType>(s);