// 浅拷贝的几种实现方式
// 1.Object.assign可实现浅拷贝,拷贝对象的key、value值,代码如下 // 注意的是:当对象只有一级属性的时候,assign是深拷贝,当对象有多级属性的时候,二级属性后是浅拷贝 let a = { age: 1 } let e = a//这里不是浅拷贝 let b = Object.assign( {},a) console.log( a===b ) // false console.log(b.age) //1 console.log(e === a);//true
// 2.ES6 的展开运算符也可以实现浅拷贝:...展开对象key,value给新对象 let c = { age : 18, name: {age1:2} } let d = { ...c } d.age = 19 console.log(d.age === c.age);//false console.log(c === d);//
//3. 数组方法实现数组的深浅拷贝 对于不包含引用对象的一维数组来说是深拷贝 对于包含引用对象的数组来说是浅拷贝 let arr1 = [{ age: 1, name: {age1:2} }] let arr2 = arr1.slice() let arr3 = [1,2,3] let arr4 = arr3.slice() console.log(arr1 === arr2);//false console.log(arr1[0].name === arr2[0].name);//true console.log(arr3 === arr4);//false
//4. 手写的方式实现浅拷贝
//浅拷贝 let obj={ "hh":"hhh", d:{ "k":"kk" } }
function shallowClone(obj){ //创建一个新对象 let newobj={} //遍历所有属性,赋值给新对象 for(let key in obj){ if(obj.hasOwnProperty(key)){ newobj[key]=obj[key] } } return newobj } let obj1 = shallowClone(obj) console.log(obj === obj1);//false console.log(obj.d===obj1.d) //true 为true则表示深层的对象只拷贝了地址 符合了浅拷贝的特点