深度克隆
深层克隆可以保证当源数据发生改动时,克隆后的数据不会根据源数据的改动发生改动
// 遍历对象 for(var prop in obj)
// 1.判断是不是原始值 typeof() object
// 2.判断是数组还是对象 instanceof toString constructor
// 3.建立相应的数组与对象
// 递归
function deepClong(orgin, target) {
var target = target || {};
var toStr = Object.prototype.toString,
arrStr = "[object Array]";
for (var prop in orgin) {
//判断是否为原型链上的
if (orgin.hasOwnProperty(prop)) {
// 判断是否为null 且 是否为对象
if (orgin[prop] !== null && typeof(orgin[prop]) == 'object') {
target[prop] = toStr.call(orgin[prop]) == arrStr ? [] : {};
deepClong(orgin[prop], target[prop]); //递归
} else {
target[prop] = orgin[prop]; //递归出口
}
}
}
return target;
}
袁老师的克隆
function objClone (obj,deep){
if(Array.isArray(obj)){
if(deep){
var newArr = [];
for(var i = 0 ; i < obj.length ; i++){
newArr.push(objClone(obj[i],deep))
}
return newArr
}else{
return obj.slice()
}
return newArr;
}else if( typeof obj === 'object'){
var newObj = {};
for(var prop in obj){
if(deep){
newObj[prop] = objClone(obj[prop],deep)
}else{
newObj[prop] =obj[prop];
}
}
return newObj;
}else{
return obj
}
}
纯函数
纯函数不依赖,修改器作用域之外的变量的函数
function add(num1,num2){
return num1 + num2;
}
这就是最简易的纯函数
不是纯函数就像克隆中,源数据改动,其函数内的也跟着改动