const obj = {
name: 'jjj',
age: 22,
friends: {
name: 'lll',
age: 23
},
hobbies: ['music', 'basketball', 'game']
}
const deepClone = (target) => {
if(typeof target !== 'object' || target == null){
return target
}
let newObj = Array.isArray(target) ? [] : {}
for(let key in target) {
if(target.hasOwnProperty(key)) {
newObj[key] = typeof target[key] === 'object' ? deepClone(target[key]) : target[key]
}
}
return newObj
}
const cloneObj = deepClone(obj)
obj.friends.name = 'aaa'
obj.hobbies.push('code')
console.log(obj)
console.log(cloneObj)
let symbolStr = Symbol('symbolStr')
console.log(symbolStr.description );
console.log(symbolStr.toString());
console.log(String(symbolStr));
let map = new Map()
map.set('', 'String')
map.set('{}', {name: 'map'})
map.set('[]', [1,2,3,3])
let symbolObj = Symbol('symbolObj')
const obj = {
name: 'maker',
age: 22,
friends: {
name: 'lll',
age: 23
},
hobbies: ['music', 'basketball', 'game'],
exercise: function () {
console.log(this.name + '在运动!');
},
[symbolStr]: 'symbolStr',
[symbolObj]: {
name: 'symbolObj',
age: 0
},
set: new Set([1,2,3,4,4]),
map: map
}
const deepClone = (target,hash= new WeakMap()) => {
if(typeof target !== 'object' || target == null){
return target
}
if(target instanceof Set) {
return new Set([...target])
}
if(target instanceof Map) {
return new Map([...target])
}
if (typeof target === "function") {
return target;
}
if(hash.has(target)) {
return has.get(target)
}
let newObj = Array.isArray(target) ? [] : {}
hash.set(target, newObj)
const symKeys = Object.getOwnPropertySymbols(target)
if(symKeys.length) {
symKeys.forEach((sKeys) => {
if(typeof target[sKeys] === 'object' && target !== null) {
newObj[sKeys] = deepClone(target[sKeys], hash)
} else {
newObj[sKeys] = target[sKeys]
}
})
}
for(let key in target) {
if(target.hasOwnProperty(key)) {
newObj[key] = typeof target[key] === 'object' ? deepClone(target[key], hash) : target[key]
}
}
return newObj
}
const cloneObj = deepClone(obj)
cloneObj.name = 'cloner'
cloneObj.friends.name = 'robot'
cloneObj.hobbies.push('study')
cloneObj[symbolStr] = 'cloneSym'
cloneObj[symbolObj].age = 2
cloneObj.set.add(5)
cloneObj.set.add(5)
cloneObj.map.set('{}', {name: 'newMapObj'})
console.log(obj)
console.log(cloneObj)
obj.exercise()
cloneObj.exercise()