关于JavaScript 数组的复制解析总结
在做此博客的时候,遇到一个很大的坑,就是在复制数组时出现了问题,所以就记录一下。我们在需要复制数组的时候一定需要注意的是,数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。比如:
var arr1 = [1, 2, 3];
var arr2 = arr1;
arr1[0] = 5;
console.log(arr2) //输出为: [5, 2, 3]
1
2
3
4
2
3
4
在上面的代码中,我们可以看出 arr2 并不是 arr1 的克隆的数组,而是指向同一份数据的另一个指针。通过修改 arr2,会直接导致 arr1 的变化。那么如何正确的复制数组呢?在这里我总结了这几种方法如下:
# 1、使用 ES5 的方法
# 1.1.slice
let arr = [2,4,434,43]
let arr1= arr.slice()
arr[0] = 'a'
console.log(arr,arr1) // [ 2, 4, 434, 43 ]
console.log(arr1 === arr) // false
1
2
3
4
5
2
3
4
5
# 1.2. 遍历数组
Array.prototype.clone = function(){
let a=[];
for(let i=0,l=this.length;i<l;i++) {
a.push(this[i]);
}
return a;
}
let arr = ['aaa','bbb','ccc','wwwww','ddd']
let arr2 = arr.clone()
console.log(arr2)
console.log( arr2 === arr )
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 1.3、 concat()
Array.prototype.clone=function(){
return [].concat(this);
//或者 return this.concat();
}
let arr = ['aaa','asss']
let arr1 = arr.clone()
arr[0] = 123
console.log(arr,arr1)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2、使用 ES6 的方法
# 2.1、Object.assign() 浅复制
let arr = ['sdsd',123,123,123]
let arr1 = []
Object.assign(arr1,arr)
arr[1] = 'aaaa'
console.log(arr,arr1) // [ 'sdsd', 'aaaa', 123, 123 ] [ 'sdsd', 123, 123, 123 ]
1
2
3
4
5
2
3
4
5
# 2.3、扩展运算符
const a1 = [1, 2];
// 写法一
const a2 = [...a1];
a1[0] = 'aaa'
console.log(a1,a2)
1
2
3
4
5
2
3
4
5
上次更新: 2024/01/30, 00:35:17
- 01
- linux 在没有 sudo 权限下安装 Ollama 框架12-23
- 02
- Express 与 vue3 使用 sse 实现消息推送(长连接)12-20