在js中,有两种数据类型
原始数据类型:string,number,boolean,undefined,null,它们的值存在栈中。
引用数据类型:object,array,它们的值,存在于堆中,它们的指针地址,存在栈中。
浅拷贝:只复制指向某个对象的指针,并不复制对象本身,新旧对象仍旧共享同一个内存,当新对象改变值时,原对象的值也会改变。
深拷贝:复制对象本身,创造出一个一模一样的对象,新旧对象的值互相不影响。
Object.assign({},obj):浅拷贝,对象第一层是深拷贝,对象的属性如果仍是引用数据类型,将会被浅拷贝。
JONS.parse(JSON.stringify()):深拷贝,但对function类型无用,拷贝后变为null。
手写深拷贝方式:
// 检测数据类型
function checkType(target){
return Object.prototype.toString.call(target).slice(8,-1)
}
function clone(target){
// 如果不是引用数据类型,返回原值
if(checkType(target) !== 'Array' && checkType(target) !== 'Object'){
return target
}
// 利用构造函数,创建一个该类型的对象
var result = new target.constructor
for(var i in target){
var val = target[i]
// 递归拷贝
result[i] = clone(val)
}
// 返回拷贝后的值
return result
}