深拷贝
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
越努力越幸运