即使未明确修改数组值,也会对其进行修改

时间:2017-08-07 20:16:09

标签: javascript arrays

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

function addToFrontOfNew(arr, element) {
  newArr = arr;
  newArr.unshift(element);
  return newArr;
}

如果我要写:

 function addToFrontOfNew(arr, element) {
  newArr = arr;
  newArr.unshift(element);
  return arr;
}

并使用addToFrontOfNew([1,2],3)测试函数,函数将返回[3,1,2]。

如何重写函数以便原始arr不会与newArr一起修改?

2 个答案:

答案 0 :(得分:1)

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

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 :(得分:-1)

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