数组的塌陷
想把arr里的值都删除掉,循环过程中数组却发生塌陷了;
1.下面来说一种方法是大家容易掉进的一个坑儿
var arr = ["a","b","c","d"];
for(var i=0;i<arr.length;i++){
arr.splice(i,1);// 从i开始 删除1个元素
}
console.log(arr);//结果是[]吗?nonono..他的结果是 (2) ["b", "d"]
//因为i初次循环,从1=0开始,但是经历第一次删掉第一项元素后 数组变成["b","c","d"];
//二次循环时i=1,再删除时,对应的是删除之后的数组的第二项"c",所以数组变成["b","d"]
//三次循环时i=2,但这时数组重新是["b","d"],索引根本就不存在2,最大才是1,故循环停止。
//所以执行结果是(2) ["b", "d"],而不是想象中的一次删除第一项后的[]结果哈。
- 数组塌陷怎么解决?? i--
var arr = ["a","b","c","d"];
for(var i=0;i<arr.length;i++){
arr.splice(i,1);// 从i开始 删除1个元素
i--;//关键始终让i循环后进入for再次循环是i=0再次开始
}
console.log(arr);//执行[]
深拷贝
第一种方法
function copyObj(obj){
var newObj = Array.isArray(obj)?[]:{}; // 新开辟了一个内存地址
for(var key in obj){ //这个循环既可以循环数组 也可以循环对象;
if(typeof obj[key] === "object"){
newObj[key] = copyObj[key];
}else{
newObj[key] = obj[key];
}
}
return newObj;
}
var obj = {name:"张三",age:20};
var arr1 = copyObj(obj);
console.log(arr1);//传入的是对象
第二种方法 性能没有上面的方法一好
可以通过JSON.stringify 和 JSON.parse 来做深拷贝
1.通过JSON.stringify 可以把对象转成一个json字符串
2.通过JSON.parse 可以把js字符串转成对象
3.但是JSON: 会忽略某些属性 ,比如undefined和function,复制后会丢掉这些元素,导致不准确
var obj={
name:"张某",
age:20,
}
var res= JSON.stringify(obj);// 把obj对象转成字符串
console.log(res);
var newObj=JSON.parse(res);//把字符串转成新的对象
console.log(newObj);//可以做深拷贝用,复制了一个跟原来一样的对象