一看就会的deepClone 深拷贝
(Deep Copy)是指创建一个新的对象,该对象的内容与原始对象完全相同,但是在内存中的位置不同。深拷贝
会递归地复制所有的嵌套对象,而不仅仅是复制引用。这意味着即使原始对象包含其他对象作为成员变量,深拷贝
也会为这些对象创建独立的副本。
深拷贝
的目的是在修改新创建的对象时不会影响原始对象。它通常用于需要保留原始数据的同时进行修改或独立操作的情况。
简易版
function deepCloneSimple(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj
}
let result
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for (let key in obj) {
if (hasOwnProperty) {
result[key] = deepCloneSimple(obj[key])
}
}
return result
}
//测试代码
const obj = {
name: 'pp',
age: 18,
friend: {
one: '1'
}
}
console.log(obj)
const obj2 = deepCloneSimple(obj)
obj2.friend.one = 2
console.log(obj2)
进阶版:
<script>
function isObject(value) {
const valueType = typeof value
return (value !== null && (valueType === 'object' || valueType === 'function'))
}
//深拷贝是一个递归函数/生成器也是递归函数--也是特殊的迭代器
//Symbol.iterator函数,调用的时候会返回一个iterator ,next方法属性 done/value属性
function deepCopy (item) {
//symbol是value的情况,直接返回这个Symbol,根据item的description创建一个新的symbol对象
if(typeof item === 'symbol'){
return Symbol(item.description)
}
//普通的类型
if (!isObject(item)){
return item
}
//函数不需要深拷贝
if (typeof item === 'function') {
return item
}
//set类型
if (item instanceof Set) {
const newSet = new Set()
for ( const setItem of item ) {
newSet.add(deepCopy(setItem))
}
return newSet
}
//judge whether it is an array
const newObject = Array.isArray(item) ? [] : {}
for (const key in item) {
//递归调用deepCopy
newObject[key] = deepCopy(item[key])
}
//遍历symbol的key
const symbolKeys = Object.getOwnPropertySymbols(item)
for (const symbolKey of symbolKeys) {
newObject[Symbol(symbolKey.description)] = deepCopy(item[symbolKey])
}
return newObject
}
//iterable object 无法copy
const info = {
name: 'abc',
friend: {
name:'yy',
age: '29',
nickName: {
name:'pp',
address:'chongqing'
}
},
set: new Set(['1','2','3']),
symbolKey: Symbol('xxxx'),
[Symbol('y')]: Symbol('p')
}
s1 = Symbol('aaa')
s2 = Symbol('aaa')
s3 = Symbol(s2.description)
console.log(s3)
console.log(s2===s3)
console.log([s3])
console.log(s1 === s2)
//for in 对象是key []是索引
//for of 可迭代对象拿到的是 value
//【】 string arguments Sets Map
console.log(deepCopy(info))
</script>