深复制:直接将数据复制给对应的变量
浅复制:将数据的地址复制给对应的变量
深复制与浅复制,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝。
js中基本类型的赋值为深复制,而引用类型的赋值为浅复制。
浅复制:(引用类型的赋值)
var a = [0,1,2];
var b = a;
console.log(a);//输出0,1,2
console.log(b);//输出0,1,2
b[0] = 10;
console.log(a);//输出10,1,2 因为是浅复制,地址中的值改变
console.log(b);//输出10,1,2
var a = [0,1,2];
b[0] = 11;
console.log(a);//输出0,1,2 因为重新var了一个a,重新赋值了地址
console.log(b);//输出1,1,2
深复制:(基本类型的赋值)
var a = 10;
var b = a;
console.log(a);//输出10
console.log(b);//输出10
a = 20;
console.log(a);//输出20
console.log(b);//输出10
深复制实现方法:
1.递归
//深复制
function clone(target,source) {
for (var key in source) {
if (source[key] instanceof Object) {
target[key] = new source[key].constructor
clone(target[key],source[key])
}else {
target[key] = source[key]
}
}
}
var lucy = {
name:'lucy',
age: 18,
favs: ['唱歌' , "跳舞", "打游戏"]
}
var lily = {}
clone(lily,lucy)
console.log(lily)//输出和lucy一样的内容
2.JSON实现深复制
//JSON方法
var tar = {}
var sour = { a: 1, b:2}
tar = JSON.parse(JSON.stringify(sour))
console.log(tar)//输出sour值
3.第三方库实现深复制lodash
//先在前面标签中引用
<script type="text/javascript" src="https://cdn.bootcss.com/lodash.js/4.17.11/lodash.min.js">
</script>
//之后使用
//lodash方法实现深复制
var obj = [{'a':1},{'b':2}]
console.dir(_)
var deep = _.cloneDeep(obj)
console.log(deep)//输出obj内容
console.log(deep[0] === obj[0])//输出false