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()附加到函数的末尾。