一、
使用JSON.parse() 和 JSON.stringify(),但是它有局限性,当值为function、undefined、Symbol时,转换中会被忽略。
二、
function deepCopy(obj){ var result = Array.isArray(obj) ? [] : {} for(var key in obj) { if (obj.hasOwnProperty(key)) { if(typeof obj[key] === 'object' && obj[key]!==null){ result[key] = deepCopy(obj[key]); } else { result[key] = obj[key] } } } return result; }
这部分参考自https://www.cnblogs.com/renbo/p/9563050.html
三、
function getType(obj){ // getType函数对元素进行类型判断 var toString = Object.prototype.toString; var map = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Undefined]': 'undefined', '[object Null]': 'null', '[object Object]': 'object', '[object Array]': 'array', '[object Function]': 'function', '[object Date]': 'date', '[object RegExp]': 'regExp' }; if(obj instanceof Element){return 'element'} return map[toString.call(obj)] } function deepClone(data){ var type = getType(data), obj; if(type === 'array'){ obj = [] for(var i = 0, len = data.length; i<len; i++){ obj.push(deepCopy(data[i])) // obj[i] = deepCopy(data[i]) } } else if(type === 'object'){ obj = {} for(var key in data){ obj[key] = deepCopy(data[key]) } } else { return data; } return obj; }
四、Object.assign() 与 slice() 只能实现浅拷贝