js深拷贝
Posted liuabo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js深拷贝相关的知识,希望对你有一定的参考价值。
getType 函数获取函数类型
首先我们要实现一个getType函数对元素进行类型判断,直接调用Object.prototype.toString 方法。
function getType(obj){ //tostring会返回对应不同的标签的构造函数 const toString = Object.prototype.toString; const map = { ‘[object Boolean]‘ : ‘boolean‘, ‘[object Number]‘ : ‘number‘, ‘[object String]‘ : ‘string‘, ‘[object Function]‘ : ‘function‘, ‘[object Array]‘ : ‘array‘, ‘[object Date]‘ : ‘date‘, ‘[object RegExp]‘ : ‘regExp‘, ‘[object Undefined]‘: ‘undefined‘, ‘[object Null]‘ : ‘null‘, ‘[object Object]‘ : ‘object‘ }; if(obj instanceof Element) { return ‘element‘; } return map[toString.call(obj)]; }
深拷贝(deepCopy)
对于一个引用类型,如果直接将它赋值给另一个变量,由于这两个引用指向同一个地址,这时改变其中任何一个引用,另一个都会受到影响。当我们想复制一个对象并且切断与这个对象的联系,就要使用深拷贝。对于一个对象来说,由于可能有多层结构,所以我们可以使用递归来解决这个问题
function deepCopy (data) { let type = getType(data), o; if (type === ‘array‘) { o = []; } else if (type === ‘object‘) { o = {}; } else { return data; } if (type === ‘array‘) { for (let index = 0; index < data.length; index++) { const element = data[index]; o.push(deepCopy(element)); } } else if (type === ‘object‘){ for (const key in data) { if (data.hasOwnProperty(key)) { const element = data[key]; o[key] = deepCopy(element); } } } return o; }
以上是关于js深拷贝的主要内容,如果未能解决你的问题,请参考以下文章