码迷,mamicode.com
首页 > 其他好文 > 详细

深度克隆

时间:2019-05-27 15:11:53      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:flags   clone   ams   const   ber   tostring   time   word   递归   

const isType = (obj, type) => { if (typeof obj !== ‘object‘) return false; const typeString = Object.prototype.toString.call(obj); let flag; switch (type) { case ‘Array‘: flag = typeString === ‘[object Array]‘; break; case ‘Date‘: flag = typeString === ‘[object Date]‘; break; case ‘RegExp‘: flag = typeString === ‘[object RegExp]‘; break; default: flag = false; } return flag; };

const getRegExp = re => { var flags = ‘‘; if (re.global) flags += ‘g‘; if (re.ignoreCase) flags += ‘i‘; if (re.multiline) flags += ‘m‘; return flags; };
 
const clone = parent => { // 维护两个储存循环引用的数组 const parents = []; const children = []; const _clone = parent => { if (parent === null) return null; if (typeof parent !== ‘object‘) return parent; let child, proto; if (isType(parent, ‘Array‘)) { // 对数组做特殊处理 child = []; } else if (isType(parent, ‘RegExp‘)) { // 对正则对象做特殊处理 child = new RegExp(parent.source, getRegExp(parent)); if (parent.lastIndex) child.lastIndex = parent.lastIndex; } else if (isType(parent, ‘Date‘)) { // 对Date对象做特殊处理 child = new Date(parent.getTime()); } else { // 处理对象原型 proto = Object.getPrototypeOf(parent); // 利用Object.create切断原型链 child = Object.create(proto); } // 处理循环引用 const index = parents.indexOf(parent); if (index != -1) { // 如果父数组存在本对象,说明之前已经被引用过,直接返回此对象 return children[index]; } parents.push(parent); children.push(child); for (let i in parent) { // 递归 child[i] = _clone(parent[i]); } return child; }; return _clone(parent); };

深度克隆

标签:flags   clone   ams   const   ber   tostring   time   word   递归   

原文地址:https://www.cnblogs.com/jaolo/p/10930663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!