[英]JavaScript scoping (copying one array to another)
在此代码中... mapObj.fetchTimeObjs
不应更改,对吗?
运行此函数时, mapObj.fetchTimeObjs
有所改变:
function clockErasePast(){
var now = new Date().getTime();
var tmpFetchTimeObjs = [];
for(var i =0; i<mapObj.fetchTimeObjs.length; i++){
tmpFetchTimeObjs.push(mapObj.fetchTimeObjs[i]);
if(mapObj.fetchTimeObjs[i].start < now){tmpFetchTimeObjs[i].start = now;}
}
return tmpFetchTimeObjs;
}
tmpFetchTimeObjs[i]
仅包含对mapObj.fetchTimeObjs[i]
引用。
如果你将改变tmpFetchTimeObjs[i]
中, mapObj.fetchTimeObjs[i]
将被改变,因为你将有只有一个引用了两个对象。 并且,如果将其从一个参考更改为第二参考,则也将更改为第二参考。
让我们考虑一个具有两个引用的对象。 在这里,我从一个引用更改了对象,并获得了第二个引用的更新,因为它们引用的是同一对象。
var objA = { name: 'Bob', age: 25}; var objB = objA; objB.age = 30; console.log(objA.age);
要获得独立的对象,您需要创建它们。 您可以使用Object.assign()
函数,该函数会将所有可枚举的属性从中复制到destination(第一个参数)对象中并返回它。
您可以使用
var obj = Object.assign({}, mapObj.fetchTimeObjs[i]);
tmpFetchTimeObjs.push(obj);
push
送到新数组的对象与原始数组相同,因此,如果对它们进行突变,则对两个数组都可见该突变。 这就是所谓的浅表复制。
您可以在更深层次上进行复制,也可以在其中创建新对象,并将原始对象的属性(例如start
)复制到这些新对象中。 您可以使用Object.assign
轻松完成此操作:
tmpFetchTimeObjs.push(Object.assign({}, mapObj.fetchTimeObjs[i]));
如果这些对象本身具有嵌套的对象,那么您遇到的问题将在更深层次上发生。 如果这是一个问题,那么您应该寻找深层克隆解决方案,如本问答中所提供的那样。
您需要克隆TimeObjs
,因为变量仅保留对TimeObjs
的引用。 我们不知道您的TimeObjs
的结构,因此,如果TimeObjs
不包含其他对象,则Object.assign()
将起作用,否则,您可能需要深度克隆方法,例如jQuery.extend()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.