2025年|某些常用的代码题

浅拷贝和深拷贝

1
2
3
4
5
6
7
8
//浅拷贝
const copy1 = {...obj};

const copy2 = Object.assign({}, obj)

const copy3 = arr.slice();

const copy4 = Array.from(arr)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//深拷贝
const deepCopy1 = JSON.parse(JSON.stringify(obj))

const deepClone(obj){
if(obj===null || typeof obj !== 'object') return obj;
if(obj instanceof Date) return new Date(obj);
if(obj instanceof Array) return obj.map(item => deepClone(item));

const cloned = {};
for(let key in obj){
if(obj.hasOwnProperty(key)){
cloned[key] = deepClone(obj(key))
}
}
return cloned
}

const deepCopy3 = _.cloneDeep(obj)

JSON方法深拷贝的局限性

1
2
3
4
5
6
7
8
9
10
11
12
13
const obj = {
date: new Date(), // 会被转为字符串
func: function() {}, // 会被丢失
undefined: undefined, // 会被丢失
infinity: Infinity, // 会被转为 null
regexp: /pattern/, // 会被转为空对象
symbol: Symbol('foo'), // 会被丢失
// 循环引用会导致错误
};

// 循环引用问题
obj.self = obj;
JSON.parse(JSON.stringify(obj)); // 报错:Converting circular structure to JSON