Javascript按值将数组传递给函数,使原始数组保持不变

Dav*_*ove 30 javascript arrays

我在这里读到了很多关于"按值"和"按引用"传递以将数组发送到javascript函数的答案.然而,我在向函数发送数组并使原始数组保持不变时遇到问题.这个例子说明了这个问题:

function myFunction(someArray)
{
// any function that makes an array based on a passed array;
// someArray has two dimensions;
// I've tried copying the passed array to a new array like this (I've also used 'someArray' directly in the code);

funcArray = new Array();
funcArray = someArray;

var i = 0;

    for(i=0; i<funcArray.length; i++)
    {
    funcArray[i].reverse;
    }

return funcArray;

}
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么这个函数中的任何东西都应该改变原始数组.

如果将函数调用分配给新数组,则调用此函数会直接更改原始数组:

myArray = [["A","B","C"],["D","E","F"],["G","H","I"]];
anotherArray = new Array();

anotherArray = myFunction(myArray);
// myArray gets modified!;
Run Code Online (Sandbox Code Playgroud)

我尝试使用.valueOf()发送原语:

anotherArray = myFunction(myArray.valueOf());
// myArray gets modified!;
Run Code Online (Sandbox Code Playgroud)

我甚至尝试按元素按子元素和子元素按元素分解数组并将所有数据分配给新的2-d数组,原始数组仍然被修改.

我还将子元素连接到一个字符串,处理它们,将它们拆分成数组,原始数组仍然被修改.

请问,是否有人知道如何将数组值传递给函数并且没有传递的数组更改?

Ja͢*_*͢ck 41

在你的功能里面有这样的:

funcArray = new Array();
funcArray = someArray;
Run Code Online (Sandbox Code Playgroud)

这实际上不会复制someArray,而是引用它,这就是原始数组被修改的原因.

您可以使用Array.slice()创建所谓的数组浅表副本.

var funcArray = someArray.slice(0);
Run Code Online (Sandbox Code Playgroud)

原始数组将保持不变,其每个元素仍将引用原始数组中的相应条目.对于"深度克隆",你需要递归地执行此操作; 以下问题讨论了最有效的方法:

在JavaScript中深度克隆对象的最有效方法是什么?

顺便说一下,我之前添加varfuncArray.这样做使它成为函数的本地而不是全局变量.


Tyl*_*hes 8

制作可以使用的数组的副本.

一个简单的方法是使用 var clone = original.slice(0);