关于javascript:数组值被修改,即使它没有被显式修改

Array value modified even though it was not modified explicitly

本问题已经有最佳答案,请猛点这里访问。

我编写了下面的代码,试图在新数组的开头添加一个元素并返回该新数组。它工作得很好,但是当我返回arr而不是newarr时,arr也发生了变化。

1
2
3
4
5
function addToFrontOfNew(arr, element) {
  newArr = arr;
  newArr.unshift(element);
  return newArr;
}

如果我要写:

1
2
3
4
5
 function addToFrontOfNew(arr, element) {
  newArr = arr;
  newArr.unshift(element);
  return arr;
}

用addtofrontofnew([1,2],3]测试函数,函数将返回[3,1,2]。

如何重写函数以使原始arr不随newarr一起修改?


您应该克隆原始数组,而不是引用它。一种方法是:

1
2
3
4
5
function addToFrontOfNew(arr, element) {
  newArr = arr.slice();
  newArr.unshift(element);
  return newArr;
}

slice()方法返回一个浅拷贝…以下是详细信息https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/array/slice


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function addToFrontOfNew(arr,element,rv)
{
    var len = arr.length;
    for(i=0; i<len; i++)
    {
        if (i==0) {
            newArr = [element,arr[0]];
        } else {
            newArr.push(arr[i]);
        }
    }

    switch(rv)
    {
        case 'arr':
            return arr;
        break;

        case 'newArr':
            return newArr;
        break;
    }

}
var fruit = ['cherries','apples','pears'];
var newElement = 'bananas';

console.log(addToFrontOfNew(fruit,newElement,'arr'));
console.log(addToFrontOfNew(fruit,newElement,'newArr'));

**修复了代码以处理注释**

添加了switch语句,以便最终用户可以返回原始数组或新数组。基本上,它计算原始数组,如果增量为0,则创建新数组,添加第一个元素,然后循环遍历数组的其余部分,将其余元素按顺序推送到数组中。switch语句允许您返回原始或新数组。在控制台日志中工作,如果使用jquery将其输出到标记,只需将.toString()附加到函数的末尾。