使用 Array.concat 完成数组深层拷贝是什么原理?

数组深层拷贝利用了一个方法arr.concat()有点不太明白?mdn里面好像没有这个吧,不传参的形式

数组:

var arr = ["a", "b"];
var arrCopy = arr;
arrCopy[1] = "c";
console.log(arr); //["a","c"];

浅拷贝与深层的拷贝?

上面的数组来说:发现对arrCopy继续拧拷贝时元数组也会进行响应的操作(变化),这就是JS的浅层拷贝, 即:对于数组、对象、对象数组进行简单复制只是创建了一份原内容的引用,指向的仍然是同一块内存区域,修改的时候会对应修改原有的内容,而有时候我们却不需要这种拷贝模式,即我么需要对原内容进行深层拷贝。

数组的深层拷贝

console.log("------");
var arr = ["a", "b"];
arrCopy = [];
for (var key in arr) {
     arrCopy[key] = arr[key];
}
arrCopy[1] = "c";
console.log(arr); //["a","b"]
console.log(arrCopy); //["a","c"]

数组深层次的拷贝方式2:slice()

arrCopy = arr.slice(0);
arrCopy[1] = "c";
console.log(arr); //["a","b"]
console.log(arrCopy); //["a","c"];

数组深层拷贝方式三 concat();

arrCopy = arr.concat(); //???
arrCopy[1] = "c";
console.log(arr); //["a","b"];
console.log(arrCopy); //["a","c"];//?????
阅读 5.3k
4 个回答

concat() 方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。
可以接受0个或多个参数,下面是摘自ECMAScript标准的一段话。
clipboard.png

arr.concat(other: [?]) 方法返回一个新数组,新数组是 arr 这个数组和其他数组的合并。注意是创建了一个新数组,所以符合你的深拷贝的目标。你调用 concat 方法时,没有给参数,所以,就是复制了一个新数组。

请参考:
http://www.w3school.com.cn/js...

你这里写的三种深拷贝都只是拷贝了数组的第一层,如果是二维数组或多维数组的话目前这三种方法都是不行的,所以js中的深拷贝需要用的递归,层层递归遍历非引用类型的属性再进行赋值 以实现真正意义上的深拷贝。

看来好多人都明白JS的引用类型,先复习mdn类型一章,足够解决你的疑问

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题