function _type(value) {
return Object.prototype.toString.call(value);
}
function _deepClone(obj) {
// 如果是null直接返回null
if (obj === null) return null;
// 如果是基本数据值或者函数,也直接返回即可(函数无需克隆处理)
if (typeof obj !== 'object') return obj;
// 如果是正则
if (_type(obj) === '[object RegExp]') return new RegExp(obj);
// 如果是日期格式的数据
if (_type(obj) === '[object Date]') return new Date(obj);
// obj.constructor:找到的是所属类原型上的constructor,而原型上的constructor指向的是当前类本身 =>保证传递进来什么类型的值,我们最后创建的newObj也是对应类型的
// obj.constructor === > constructor ====> 类
let newObj = new obj.constructor;
for (let key in obj) {
if (!obj.hasOwnProperty(key)) break;
// 如果某一项的值是引用值吗,我们还需要进一步迭代循环,把引用值中的每一项也进一步克隆 =>深度克隆
newObj[key] = _deepClone(obj[key]);
}
return newObj;
}
let arr1 = [10, 20, {
name: 'zxw'
}, /^d+$/, function () {}];
let arr2 = _deepClone(arr1);
console.log(arr2);
let obj1 = {
name: 'zxw',
ke: ['node', 'vue', 'react'],
teacher: {
n: 'jack',
m: 'mike'
}
};
let obj2 = _deepClone(obj1);
console.log(obj2);
Object.prototype.toString.call(value) 可以用来 判断数据类型 链接: https://www.cnblogs.com/cn-chy-com/p/11524980.html