目录
JOSN.stringify() 和 JSON.parse() 实现深拷贝
如何区分深拷贝与浅拷贝
- 假设 b 复制了 a,当修改 a 时,看 b 是否发生变化;如果 b 跟着变化,说明是浅拷贝;如果 b 没有发生变化,那是深拷贝
- 浅拷贝例子:
const a = [1, 2, 3]
const b = a
a[0] = 0
console.log('a', a)
console.log('b', b)
基本数据类型与引用数据类型
- 基本数据类型有:number、string、boolean、undefined、symbol、BigInt 任意精度整数
- 引用数据类型有:Array、Object、Function、null,null 是特殊的引用类型
基本数据类型和引用类型存储方式
- 基本数据类型存储栈内存、引用数据类型存储堆内存
递归实现深拷贝
- 深拷贝可以使用递归去复制所有层级属性
- Array.isArray() 确定传递的值是否是一个 Array,如果是一个 Array 返回 true,否则返回 false
- obj.hasOwnProperty() 判断属性是否是对象自身拥有的属性,如果是对象自身拥有的属性返回 true,否则返回 false
- typeof 对象中属性值的数据类型(检测变量数据类型),返回 string 类型
function deepClone(obj){
let objClone = Array.isArray(obj) ? [] : {}
for(let key in obj){
if(obj.hasOwnProperty(key)){
//判断obj子元素是否为对象,如果是,递归复制
if(typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key])
} else {
//如果不是,简单复制
objClone[key] = obj[key]
}
}
}
return objClone
}
let a = [1, 2, 3, 4],
b = deepClone(a)
a[0] = 2
console.log(a, b)
JOSN.stringify() 和 JSON.parse() 实现深拷贝
function deepClone(obj){
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a = [0, 1, [2, 3], 4],
b = deepClone(a)
a[0] = 1
a[2][0] = 1
console.log('a', a, 'b', b)
参考资料