前言
首先需要知道javascript的数据类型:栈内存(%) 堆内存(*)
- number----------->%
- string-------------->%
- boolean------------>%
- undefined---------->%
- null----------------->%
- Object -------------->*
- Symbol(ES6)
深拷贝与浅拷贝的区别就是,修改是否会造成相互影响。
赋值
简单数据类型才谈赋值,复杂数据类型谈的是拷贝(Object)。
浅拷贝
var obj1 = {name:'zhangsan',age:200};
var obj2 = obj1;
obj1.sex='male';
console.log(obj1,obj2) //结果是相同的,原因是浅拷贝只复制指向某个对象的指针,而不复制对象本身。
深拷贝的实现方法
- for/for in
var obj1 = {name:'jojo',age:200,sex:'male'}
var obj2 = {};
for(let item in obj1){
obj2[item]=obj1[item]
}
obj1.name='kaka';
console.log(obj1,obj2)
- JSON.parse/stringfy
var obj1 = {name:'jojo',age:200,sex:'male'}
var obj2 = {};
obj2 = JSON.parse(JSON.stringify(obj1))
obj1.name='kaka';
console.log(obj1,obj2)
- Object.create()
var obj1 = {name:'jojo',age:200,sex:'male'};
obj1.name='kaka';
var obj2 = Object.create(obj1)
console.log(obj1,obj2)
- 解构赋值就是一种深拷贝
var arr1 = [1,2,3,4,5,6,7];
var [...arr2]=arr1;
//let {...rest} = obj
arr1.splice(0,1)
console.log(arr1,arr2)
- 数组的Array.from()也是一种深拷贝
var arr1 = [1,2,3,4,5,6,7];
var [...arr2]=arr1;
arr1.splice(0,1)
console.log(arr1,arr2)
- 特殊(es6)Object.assign是一种浅拷贝,但是可以通过
Object.assign({},obj1,obj2...)
的方法深拷贝。
最后:
建议使用Lodash。
网友评论