深拷贝和浅拷贝
// a = 基础数据类型 或 复杂数据类型
// b = a
// 基本数据类型 在赋值的时候值拷贝
// 复杂数据类型 栈内存中存地址,堆内存中存真实的值,赋值后两个变量指向同一块内存空间(或者说只复制了指向某个对象的指针) 修改被赋值的变量,原始变量也会跟着改变
// 深拷贝
// 1.Objecet.assign()
// 可以对非嵌套对象进行深拷贝的方法,如果对象中出现嵌套情况,那么其他被嵌套对象的行为就成了普通的浅拷贝。
// 2.JSON.stringify()/JSON.parse()
// 对于 undefined、任意的函数以及 symbol 三个特殊的值分别作为对象属性的值、数组元素、单独的值时 JSON.stringify()将返回不同的结果。
const data = {
a: "aaa",
b: undefined,
c: Symbol("dd"),
fn: function() {
return true;
}
};
JSON.stringify(data); // 输出: "{"a":"aaa"}"
// 假设 undefined、任意的函数以及 symbol 值作为数组元素会是怎样呢
JSON.stringify(["aaa", undefined, function aa() {
return true
}, Symbol('dd')]) // 输出:"["aaa",null,null,null]"
// 单独序列化这些值会是什么样的结果呢
JSON.stringify(function a (){console.log('a')})
// undefined
JSON.stringify(undefined)
// undefined
JSON.stringify(Symbol('dd'))
// undefined
// 3.用递归的方式进行深拷贝 (对象深拷贝)
function deepClone(dest,src){ //dest为目标对象 src为源对象
var dest=dest||{}
for(var key in src){
if(typeof src[key]==="object"){ //typeof[] 和 typeof{} 结果都是objct
//如果对象的属性又是对象
dest[key]=(src[key].constructor===Array)?[]:{}
deepClone(dest[key],src[key])
}else{
dest[key]=src[key]
}
}
return dest
}
var a={
name:"Bob",
age:16,
parents:{
father:"Jack",
mother:"Marry"
}
}
var b=deepClone({},a)
console.log(a)
console.log(b)
// 4.引入函数库 lodash,该函数库也有提供 _.cloneDeep()
var _ = require('lodash');
var obj1 = {
a: 1,
b: { f: { g: 1 } },
c: [1, 2, 3]
};
var obj2 = _.cloneDeep(obj1);
console.log(obj1.b.f === obj2.b.f);
// 浅拷贝
// 1.Objecet.assign()
// 可以对非嵌套对象进行深拷贝的方法,如果对象中出现嵌套情况,那么其他被嵌套对象的行为就成了普通的浅拷贝。
// 2.Array.concat() //数组连接
// 3.Array.slice() //数组切片