保持原始数组不变,更改函数中的本地副本
Keep original array intact, change local copy in function
即使我在函数内部进行克隆,嵌套数组也会发生更改。保存a
阵列的最有效方法是什么?JSBin在这里。
var a = [[2,3],[1,5,2],[3,7,2]];
function c(a) {
var l = a.slice(0);
console.log('in func, before change',l);
l[1].splice(1,1);
console.log('in func, after change',l);
}
console.log('before call', a);
c(a);
console.log('after call',a);
您的代码在一维数组上运行良好:
function c(a) {
var l = a.slice(0);
console.log('in func, before change',l);
l[1] = 17;
console.log('in func, after change',l);
}
var a = [2,3,1,5,2,3,7,2];
console.log('before call', a);
c(a);
console.log('after call',a);
输出:
"通话前"[2,3,1,5,2,3,7,2]"在func中,更改前"[2,3,1,5,2,3,7,2]在func中,更改后[2,17,1,5,2,3,7,2]"通话后"[2,3,1,5,2,3,7,2]
事实上,这是一个2D阵列正在给你洗澡。查看这个关于克隆2D javascript数组的堆栈溢出响应:
使用javascript 克隆多维数组
现在使用这个代码:
Array.prototype.clone = function() {
var arr = this.slice(0);
for( var i = 0; i < this.length; i++ ) {
if( this[i].clone ) {
//recursion
arr[i] = this[i].clone();
}
}
return arr;
}
function c(a) {
var l = a.clone();
console.log('in func, before change',l);
l[1].splice(1,1);
console.log('in func, after change',l);
}
var a = [[2,3],[1,5,2],[3,7,2]];
console.log('before call', a);
c(a);
console.log('after call',a);
输出:
"通话前"[[2,3],[1,5,2],[3,7,2]]"在func中,更改前"[[2,3],[1,5,2],[3,7,2]]在func中,更改后[[2,3],[1,2],[3,7,2]]"通话后"[[2,3],[1,5,2],[3,7,2]]
.slice不执行"深度"复制。由于"a"的每个元素都是一个数组iteslf,因此"a"中的元素都是对那些内部匿名元素的引用。
数组"l"保存引用的副本,复制的引用仍然指向它们所引用的相同"对象"。
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- lodash/underscore.js函数来创建由x的n个副本组成的数组
- 如何在 Javascript 中从函数本身或其副本访问属性
- Do,内部函数和外部函数获得相同变量的各自副本
- 保持原始数组不变,更改函数中的本地副本
- 在.splice()之后重置角度函数中数组的副本
- bind是否创建函数的新副本
- 将创建多少个内部函数的副本
- 一个JS函数如果是一个正在工作的JS函数的近似副本,那么它将无法工作