前置知识
基本类型直接存储于栈内存中
对象类型的值存储于堆内存中,对象的属性值存储的只是它的堆内存的地址(指针)。
什么是浅拷贝?什么是深拷贝?
- 深浅拷贝主要是针对于对象类型
- 浅拷贝:只能拷贝第一层的属性。拷贝的栈内存里面的值。
对于基本类型,拷贝的是值,对于对象类型,拷贝的是内存地址 - 深拷贝:递归拷贝对象的每一个属性。
如何实现浅拷贝?
let a = {
name: '张三',
job: {
name: '腾讯'
}
}
// 第一种:利用es6的Object.assign()
let b = Object.assign({}, a)
// 第二种:利用扩展运算符...
let c = { ...a }
// 第三种
function shallowClone (obj) {
function isObject(obj) {
console.log(typeof obj)
return typeof obj === 'object' || typeof obj === 'function' && typeof obj !== null
}
if (!isObject(obj)) {
throw new Error('不是对象')
}
let newObj = Array.isArray(obj) ? [...obj] : {...obj}
return newObj
}
如何实现深拷贝?
JSON序列化
let a = {
name: '张三',
job: {
name: '腾讯'
}
}
// 第一种
JSON.parse(JSON.stringify())
该方法有以下的局限:
- 会忽略undefine、symbol、函数
- 不能解决循环引用的对象
简易版深拷贝
function deepClone (obj) {
function isObject(obj) {
return typeof obj === 'object' || typeof obj === 'function' && typeof obj !== null
}
if (!isObject(obj)) {
throw new Error('不是对象')
}
let newObj = Array.isArray(obj) ? [...obj] : { ...obj }
Object.keys(newObj).forEach(key => {
const oldValue = obj[key]
newObj[key] = isObject(oldValue) ? deepClone(oldValue) : oldValue
})
return newObj
}
网友评论