Javascript 深拷贝是一个面试经常遇到的问题。深拷贝主要考察两点:
1、JavaScript的数据类型
2、递归算法
话不多说,我们直接看代码
// js 内置的特殊对象类型
const specialTypes = {
'[object Date]': val => new Date(val),
'[object Function]': val => val,
'[object RegExp]': val => new RegExp(val)
}
function deepClone(value) {
let result = null;
// 通过 typeof 判断非对象类型
if (typeof value !== 'object') {
return value;
}
// 借调 Object 的 toString 方法返回数据类型签名
const valType = Object.prototype.toString.call(value);
// 判断是 Array 类型
if (valType === '[object Array]') {
result = [];
value.forEach((item, index) => {
result[index] = deepClone(item);
})
}
// 判断是 Object 类型
if (typeof value === 'object') {
// 过滤 null、undefined 类型
if (value == null) {
return value;
}
// 过滤内置的特殊对象类型
if (specialTypes[valType]){
return specialTypes[valType](value);
}
// 剩下则为普通对象类型
result = {};
Object.keys(value).forEach(key => {
result[key] = deepClone(value[key])
})
}
return result;
}
var target = {a: 1, b: null, c: 0, d: [1, 2, 3, {x:1, y: 2}], f: new Date()}
var result = deepClone(target);
console.log(result)