区别:
浅拷贝是指, 修改B对象的属性和方法会影响到A对象的属性和方法, 我们称之为浅拷贝
深拷贝是指, 修改B对象的属性和方法不会影响到A对象的属性和方法, 我们称之为深拷贝
1.1浅拷贝
(1)使用for...in循环
for(var key in obj){
newobj[key]=obj[key]
}
(2)使用Object.assign()拷贝
var newobj =Object.assign({},obj1,obj2...)
//可以使多个对象合并到一起
(3)使用扩展运算符的方式
var newObj={...obj}
上述三种方式都是改变数据之后,会改变另外一个数据
1.2深拷贝
(1)使用lodash库
var newObj=_.cloneDeep(obj)
//原理,使用递归调用自己,反复执行 for...in 遍历
(2)使用JSON的方法
var newObj =JSON.parse(JSON.stringify(obj))
//实现互相不影响的深拷贝,但是会有缺陷
//在拷贝函数的时候,会忽略,其他undefined RegExp...也会丢失和忽略
手动编写深拷贝
var person = {
name: '小宝',
age: 20,
gender: "男",
hobby: ["演电影", "唱歌"],
gf: {
name: "kris Wu",
age: 29,
say: function() {
console.log("skr skr")
}
}
}
// 检测参数的类型
function typeData(o){
if(o === null) return "Null"
if(o === undefined) return "Undefined"
// 得到数据类型的值 "[Object Object]" => Object
return Object.prototype.toString.call(o).slice(8, -1)
}
// 深拷贝主方法
function deepClone(target){
var result // 创建存储的值
// 检测传入的参数
if(typeData(target) === "Object"){
result = {}
}else if(typeData(target) === "Array"){
result = []
}else{
return target // return 之后不会往下执行
}
// 只有是对象或者数组才会执行 for...in 遍历
for(var k in target){
// 检测 target 的 k 属性
if (typeData(target[k]) == "Object") {
// 调用递归得到结果并赋值
result[k] = arguments.callee(target[k]) //代表deepClone()函数
}else if (typeData(target[k]) == "Array") {
result[k] = arguments.callee(target[k])//代表deepClone()函数
}else{
result[k] = target[k]
}
}
return result
}
var obj2 = deepClone(person)
obj2.hobby.push("打王者")
obj2.bf.name = "王大锤"
console.log(person)
console.log(obj2)