js之数据污染与深度克隆

本次讲解写js之数据污染。

什么叫污染,这个污染就是类似与生活中的污染一样,比如说抹布使用了以后就会脏脏的,这个就是污染。那么js中的数据如果使用了,数据发生了变化,那就是数据污染。

js基本类型数据是不会存在数据污染的,只有引用类型会存在数据污染,比如说数组,对象。

一个数组的数据污染例子:

var arr = [1,2,3];
var nArr = arr;
nArr.push(4);
console.log(nArr); // 打印[1,2,3,4]
console.log(arr); // 打印[1,2,3,4]

那么arr 数组就是被污染了。

怎么保证不会被污染呢,其实对于数组来说有好多中,map,filter,concat,es6的扩展符等等多种方法。对于对象来说,一般就是转json与解析json,就可以达到要求,要么就是es6的拓展符,要么defineProperty。

最后总结下,既可以在数组使用的,也可以在对象使用的,json,与es6的拓展符。但是json的方法只使用与二维数组,深数组不适应。

揭秘最终的方法,自己写一个函数来深度克隆数据,这样子就可以防止数据污染,而且可以在数组和对象中使用。

deepClone方法:

function deepClone(obj) {
    var result;
    var oClass = isClass(obj);
    if(oClass === "Object"){
        result = {};
    }else if(oClass === "Array"){
        result = [];
    }else{
        return obj;
    }
    for(var key in obj){
        var copy = obj[key];
        if(isClass(copy)=="Object"){
           result[key]=arguments.callee(copy);//递归调用
        }else if(isClass(copy)=="Array"){
           result[key]=arguments.callee(copy);
        }else{
            result[key]=obj[key];
        }
    }
 return result;
}
    //判断对象的数据类型
 function isClass(o){
   if(o===null) 
       return "Null";
   if(o===undefined) 
       return "Undefined";
    return Object.prototype.toString.call(o).slice(8,-1);
}

最终的测试自己来吧

 

ps:使用map,filter等数组方法去克隆数组对象,会被污染。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值