在此代码中... 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()
函数,它将任何可枚举属性复制到目标(第一个参数)对象中并返回它。
您可以使用以下方式创建
var obj = Object.assign({}, mapObj.fetchTimeObjs[i]);
tmpFetchTimeObjs.push(obj);
关于JavaScript 作用域(将一个数组复制到另一个数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41648892/