繁体   English   中英

JavaScript作用域(将一个数组复制到另一个数组)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM