Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript如何确保for each';t更改范围更大的对象的值_Javascript_Foreach_Scoping - Fatal编程技术网

Javascript如何确保for each';t更改范围更大的对象的值

Javascript如何确保for each';t更改范围更大的对象的值,javascript,foreach,scoping,Javascript,Foreach,Scoping,我在为一个我正在工作的项目确定范围时遇到了一些问题,并且能够将问题概括如下 我有一个对象列表,我想使用foreach循环迭代这些对象,并将其传递给helper函数。在helper函数中,我希望在不修改原始对象的情况下操作对象的本地范围版本 我知道javascript中的函数通过引用传递对象,但应该可以在本地确定引用的范围 有人知道我做错了什么吗?有没有一种方法可以在不克隆对象的情况下执行此操作。我不想重建每个对象,因为对象非常大,性能很重要 var gloabalList = [{n:0},{n

我在为一个我正在工作的项目确定范围时遇到了一些问题,并且能够将问题概括如下

我有一个对象列表,我想使用foreach循环迭代这些对象,并将其传递给helper函数。在helper函数中,我希望在不修改原始对象的情况下操作对象的本地范围版本

我知道javascript中的函数通过引用传递对象,但应该可以在本地确定引用的范围

有人知道我做错了什么吗?有没有一种方法可以在不克隆对象的情况下执行此操作。我不想重建每个对象,因为对象非常大,性能很重要

var gloabalList = [{n:0},{n:0},{n:0}];
var output = [];
gloabalList.forEach((item,index)=>{
    gloabalList[index].n = index;
    //at this point the value n is the index
    messUpItem(item);    
    //at this point n is 2 we want it to be the index
    output.push(item.n);
});

//we want this to be (1,2,3) but it is returning (2,2,2)
alert(output);

function messUpItem(item){
    var x = item;// this should copy object val but its grabbing a reference
    x.n = 2;
    return item;
}

嗨,Patrick,感谢您的快速响应。我知道我可以克隆对象,但这不是一个好的解决方案,因为对象可能很大,性能是一个问题。有没有一种方法可以在不克隆对象的情况下修改本地范围内的对象?您可以执行以下操作来冻结更改后的属性。但有两个警告:1。它不会冻结属性可能包含的任何对象。例如,
{a:1,b:{c:2}
,在这里,即使您调用了
Object.freeze()
,您仍然可以执行
a.b.c=3
。但是你可以做深度冻结,迭代所有属性和子属性,冻结每个对象。2.你不能解冻它