js之数组克隆

9次阅读

共计 1348 个字符,预计需要花费 4 分钟才能阅读完成。

js 主要分基本数据类型及引用数据类型两大类
基本数据类型包括:number,string,undefine,null,boolean,Symbol(es6 新增)
引用数据类型:Object,Array,Function,Data 等
注意:基本数据类型放在 ** 栈空间内 **,并且是按值存放,可以直接读取和操作。
引用数据类型存放在 ** 堆空间内 **(门),变量的值其实是指向堆空间的地址(钥匙),因此如果克隆这个变量,相当于复制钥匙。

let arr = [1,2,3,4,5]
let arr1 = arr // 这一步相当于把 arr 栈空间的地址赋给了 arr1,其实 arr 和 arr1 操作的是同一个堆空间的对象
arr1.push(6) // arr1 = [1,2,3,4,5,6]
console.log(arr) //[1,2,3,4,5,6]
因此对于引用类型的拷贝,需要拷贝堆空间的对象
数组浅拷贝 1. 运用数组 slice 与 concat 方法返回一个新数组的特性
let arr = [1,2,3,4,5]
let arr1 = arr.slice() //[1,2,3,4,5]
let arr2 = arr.concat() //[1,2,3,4,5]

2. 简单粗暴的方法 - 遍历
let arr = [1,2,3,4,5]
let arr2 = []
arr.forEach(item=>{
arr2.push(item)
}
)
console.log(arr2)
3.es6 新增方法 - 拓展运算符
let arr = [1,2,3,4,5]
let arr1 = […arr] //[1,2,3,4,5]
4.es6 新增方法 -Object.assignlet arr = [1,2,3,4,5]let arr1 = []Object.assign(arr1,arr)console.log(arr1) //[1,2,3.4,5]
如果数组里嵌套数组和对象,浅拷贝只会拷贝该数组或者对象存放在栈空间的地址,因此无论在新旧数组中改变此地址指向的对象,两个数组都会发生改变。因此我们需要深拷贝来拷贝此类数组。
数组深拷贝 1. 普通遍历,遍历到引用类型时候进行引用类型的拷贝
let arr = [1,2,3,4,5,{name:’bob’},[‘a’,’b’]]
function clone (arr) {
let arr1 = []
arr.forEach(item=>{
// 如果不是 object,将该值插入到新数组
if(typeof(item) !== ‘object’) {
arr1.push(item)
} else {
// 根据遍历的对象新建一个相同类型的空对象
let obj = item instanceof Array ? [] : {}
for(var key in item){
if(item.hasOwnProperty(key)){
obj[key] = item[key]
}
}
arr1.push(obj)
}
})
return arr1
}
let arr1 = clone(arr)
arr1[5].name = ‘js’
console.log(arr,’arr’,arr1,’arr1′)
2. 简单粗暴(能拷贝数组和对象,但不能拷贝函数)
let arr = [1,2,3,4,5,{name:’bob’},[‘a’,’b’]]
let arr1 = JSON.parse(JSON.stringify(arr))

正文完
 0