数据类型
数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol) 和 对象数据类型
基本数据类型的特点:直接存储在栈(stack)中的数据
引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在 堆内存里
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的
浅拷贝只复制指向某个对象的指针,新旧对象还是共享同一块内存,修改新对象会改到原对象。
要是{name:“wn”,friend:{ age:18}} name是基本数据 修改 不会影响 friend 为引用数据 会改到原对象
但深拷贝会赋值一个一模一样的对象,新旧对象 不共享内存,修改新对象不会改到原对象。
浅拷贝方式
= 直接赋值
let a = {name: 'jack',age: 22,girlFriends:{first: 'lili',second: 'lisa',third: 'alice'}
}let obj = a;
Object.assign()
let a = {name: 'jack',age: 22,girlFriends:{first: 'lili',second: 'lisa',third: 'alice'}
}let obj = Object.assign({},a);
Array.prototype.concat()
let arr = [1,32,{name: 'jack'}];
let newArr = arr.concat();
Array.prototype.slice()
let arr = [1,32,{name: 'jack'}];
let newArr = arr.slice();
解构进行拷贝
对一维数组使用解构,进行拷贝,结果是深拷贝
let arr = [1, 2, 3];
let newArr = [...arr];
对多维数组使用解构,进行拷贝,结果是浅拷贝
let arr = [[1, 2, 3], [4, 5, 6]];
let newArr = [...arr];
深拷贝方式
JSON.parse(JSON.stringify()) – 不能处理函数
let arr = [1,2,{name:'jack'}];
let newArr = JSON.parse(JSON.stringify(arr));
手写递归
1
function deepCopy(newobj, oldobj) {for (var key in oldobj) {if (oldobj[key] instanceof Array) {newobj[key] = []deepCopy(newobj[key], oldobj[key])} else if (oldobj[key] instanceof Object) {newobj[key] = {}deepCopy(newobj[key], oldobj[key])} else {newobj[key] = oldobj[key]}}
}
deepCopy({}, obj)
2
typeof [] == "object"
typeof {} == "object"
Object.entries(["aa", "bb"])
Object.entries({ name: "andy", age: 18 })
function Copy(obj) {let targetObj = obj instanceof Array ? [] : {}for (const [k, v] of Object.entries(obj)) {targetObj[k] = typeof v == "object" ? Copy(v) : v}return targetObj
}let newObj = Copy(obj)
lodash库完成深拷贝
let obj = {name:'老虎',age:'18',hobby:['吃肉','睡觉']}let obj2 = _.cloneDeep(obj)