1. JSON方法
JSON.parse(JSON.stringify(target))
缺点:不可序列化属性(函数,Error对象等等)会被忽略,constructor丢失,原型链丢失
2. 递归复制
参照https://github.com/pvorb/clone ,写了个伪代码
(1)支持复制 基本类型/对象/数组/Symbol/Error/Date/RegExp/function ,其中function为浅复制
(2)支持对 包含循环引用的对象 的复制
(3)校正constructor并包含原型链
function clone(parent) {
//存储已经复制过的键,仅包含引用类型
//用于检查是否存在循环引用
var allParents = []
var allChildren = []
//返回复制值
function _clone(parent) {
var child //复制的内容暂存于此
//以下判断 parent类型
//一 基本类型,Symbol类型,null, 函数(浅复制):
// if (typeof parent != 'object') {
// return parent; //基本类型直接返回
// }
//二 引用类型
//若为array类型
//child=[]
//若为Object类型
//child={}
// 1.设置child的constructor及prototype
// var proto = Object.getPrototypeOf(parent);
// child = Object.create(proto);
// 2.检查是否是循环引用并储存
// var index = allParents.indexOf(parent);
// if (index != -1) {
// return allChildren[index]; //发现以前复制过这个键,直接返回当前复制时的值
// }
// allParents.push(parent);
// allChildren.push(child);
// 3.递归调用,进行赋值
// for (var i in parent) {
// child[i] = _clone(parent[i])
// }
//
//三 其它引用类型
//RegExp类型 child=new RegExp(parent.source, __getRegExpFlags(parent))
//Date类型 child = new Date(parent.getTime())
//Error类型 child = Object.create(parent);
//四 尝试在引用类型中复制Symbol类型
//var symbol=Object.getOwnPropertySymbols(parent);
//对其进行遍历
//var item=symbol[i]
//child[item]=_clone(parent[item])
return child
}
return _clone(parent)
}