简单来区别下深拷贝和浅拷贝:假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,这就是浅拷贝;如果B没变,那就是深拷贝
基本数据类型:number,string,boolean,null,undefined。
引用数据类型:对象,数组,函数
a.基本类型--名、值存储在栈内存中
b.引用数据类型--名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值
一、浅拷贝
原始类型为值传递,对象类型仍为引用传递
二、深拷贝
2.1 方式一
Json.parse(json.stringify(obj/arr))
2.2 方式二
/**
* 0. 遍历传入的对象
* 1. 判断是不是原始值(typeof),如果是,直接赋值,如果不是进行第二步
* 2. 判断是数组还是对象 (instanceof、toSctring、constructor)
* 3. 建立新的数组或者对象
* 4. 重复上述步骤
* */
function deepclone(obj) {
var tempObj = Object.prototype.toString.call(obj) == "[object Array]" ? [] : {};// 判断传入的是数组还是对象
for (var prop in obj){// 遍历传入的对象
// 判断是否是自己的属性,避免拿到原型上的属性
if(obj.hasOwnProperty(prop)){
if(obj[prop] !== 'null' && typeof obj[prop] == 'object'){
// 引用值走这里
if(Object.prototype.toString.call(obj[prop]) == "[object Array]"){
tempObj[prop] = []
}else {
tempObj[prop] = {}
}
deepclone(tempObj)
}else {
// 原始值走这里
tempObj[prop] = obj[prop]
}
}
}
return tempObj
}
三、$.extend()
$.extend( [deep ], target, object1 [, objectN ] )
deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
target: Object类型
目标对象,其他对象的成员属性将被附加到该对象上。
object1 objectN可选。 Object类型
第一个以及第N个被合并的对象。