纯函数:
不依赖、不修改外部作用域;
深度克隆:
思路:
1.遍历对象:
for (prop in origin) {
if (origin.hasOwnProperty(prop)) { //过滤继承的属性
}
}
2.用typeof判断是原始值还是引用值
if (origin[prop] != null && typeof (origin[prop]) == 'object')
2.1.如果是原始值,直接赋值
target[prop] = origin[prop];
2.2.如果是引用值
3.判断是数组还是对象:
如何判断参考:https://www.jianshu.com/p/898d860497ed,这里推荐if(A instanceof Array),A是不是Array构造函数构造出来的。
3.1如果是数组,创建空数组[];如果是对象,创建空对象{}
if (是数组) {
target[prop] = [];
} else {
target[prop] = {};
}
4.递归;
deepClone(origin[prop], target[prop]);
完整代码
function deepClone(origin, target) {
var target = target || {} //严谨性判断
for (prop in origin) {
if (origin.hasOwnProperty(prop)) { //过滤继承的属性
if (origin[prop] != null && typeof (origin[prop]) == 'object') {
if (origin[prop] instanceof Array) { //判断是不是数组
target[prop] = [];
} else {
target[prop] = {};
}
deepClone(origin[prop], target[prop]);
} else {
target[prop] = origin[prop];
}
}
}
}