1. 函数的参数如果是基本的数据类型就会生成一个副本传到函数内部
2. 函数的参数如果是引用数据类型就把引用数据类型的内存地址传到函数内部
深拷贝:
方法一:
var xm = {
age:18,
score:4
}
function deepCopy(obj){
var str,newobj = obj.constructor === ‘Array‘?[]:{}
if(typeOf(obj) === ‘Object’){
return obj;
}else if(window.JSON){
str = JSON.stringify(obj);
newobj = JSON.parse(str);
}else{
for(let i in obj){
newobj[i] = typeOf(obj) === ‘Object‘?deepCopy(obj):obj[i]
}
}
return newobj;
}
var xh = deepCopy(xm);
Conosole.log(xh.age === xm.age);
Console.log(xh === xm);
方法二:Object.assign()
1. 当对象只有一级属性的时候没有二级属性的时候 此方法就是深拷贝
2. 但是当对象中存在对象的时候此方法就被称为浅拷贝
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = Object.assign({}, obj1);
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }
方法三:通过jQuery的extend方法实现深拷贝
var array = [1,2,3,4]; var newArray = $.extend(true,[],array);
方法四:lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝
浅拷贝的案例:数组复制浅拷贝存在一定问题
拷贝的和被拷贝的数组会相互影响
原文:https://www.cnblogs.com/broad/p/9991776.html