本次讲解写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等数组方法去克隆数组对象,会被污染。