Javascript Object.assign{}和Object.assign[]有区别吗
我正在浏览一位不知名开发人员的一些旧代码,注意到他有时使用Javascript Object.assign{}和Object.assign[]有区别吗,javascript,typescript,Javascript,Typescript,我正在浏览一位不知名开发人员的一些旧代码,注意到他有时使用 Object.assign({}, xyz) 还有其他他用过的 Object.assign([], abc); 两者之间有区别吗?是的,有区别。一个将值指定给新对象,另一个将值指定给新数组 查看此处的输出,并与实际浏览器控制台中的输出进行比较 var abc={foo:bar}; var r1=Object.assign({},abc); var r2=对象分配([],abc); 控制台日志(r1); 控制台日志(r2)对象。
Object.assign({}, xyz)
还有其他他用过的
Object.assign([], abc);
两者之间有区别吗?是的,有区别。一个将值指定给新对象,另一个将值指定给新数组 查看此处的输出,并与实际浏览器控制台中的输出进行比较
var abc={foo:bar};
var r1=Object.assign({},abc);
var r2=对象分配([],abc);
控制台日志(r1);
控制台日志(r2)
对象。assign
是一个函数,它将可枚举的自身属性从一个对象复制到另一个对象(称为target)并返回目标对象。由于数组也是对象,所以您也可以将属性复制到它们,但是,它们不会在迭代期间显示
以以下代码段为例:
是一个obj
对象
是一个arr
,但也是一个对象
数组
为1arr.a
不打印arr.forEach
a
const obj=Object.assign({}{
答:1,,
0: 2
});
const arr=Object.assign([]{
答:1,,
0: 2
});
控制台日志(obj类型);
控制台日志(arr类型);
console.log(Array.isArray(arr));
控制台日志(obj);
控制台日志(arr);
console.log(Object.keys(arr));
控制台日志(arr.a);
arr.forEach((item,idx)=>console.log(`${idx}:${item}`));
//测试评论中的问题
设copiedObj={a:123};
让copy=Object.assign({},copiedObj);
控制台日志(副本);
copiedObj=[];
console.log(copiedObj);
控制台日志(副本)代码>那么是什么导致复制的对象发生更改?假设我像您一样分配obj。然后我将a:1改为a:435和0:bbb。为什么我发现我的obj也改变了?难道不应该是一个副本吗?我不太明白你的意思,如果你做obj.a=435
你可以期望它会改变。是的,出于某种原因,如果我复制对象,例如:const obj=object.assign({},abc);然后在下一行我做abc=[];那么obj也将=[];由于某种原因,复制的对象仍然链接到我的原始对象,即使它应该是它的副本。@CodeMan03我在代码段中添加了你的示例,我无法复制。我想我需要克隆deep。我在一个对象中有一个对象,嵌入的对象正在更改。我也不能使用Json.parse(Json.stringify(object))作为保存javascript日期所需的嵌入对象。所以我安装了lodash cloneDeep