js 对象的深复制和浅复制

来源:互联网 发布:tcp监听端口阻塞 编辑:程序博客网 时间:2024/06/06 10:52

浅复制:只赋值一层对象,并不递归赋值对象内嵌套的对象
深复制:递归赋值对象中的所有值和对象

1.数组的浅复制 – slice

var arr_1 = [1,2,3];var arr_2 = arr_1.slice(0);//slice方法取出数组的每一项传入一个新数组arr_2.push(4);console.log(arr_1);//[1,2,3]console.log(arr_2);//[1,2,3,4]

2.数组的浅复制 –concat

var arr_1 = [1,2,3];var arr_2 = arr_1.concat();//concat方法取出数组的每一项传入一个新数组arr_2.push(4);console.log(arr_1);//[1,2,3]console.log(arr_2);//[1,2,3,4]

3.数组的深复制 –JSON.stringify (同样适用于对象)

//这个方法不能复制数组中带有非json数据格式,不允许的数据类型例如Functionvar arr_1 = [1,2,{a:3}];var arr_2 = JSON.parse(JSON.stringify(arr_1));//数组转为JSON字符串再转为数组arr_2[2].a = 4;console.log(arr_1);//[1,2,{a:3}]console.log(arr_2);//[1,2,{a:4}]

4.对象的的浅复制 –for in (同样适用于数组)

var obj_1 = {a:1,b:2}function copy(obj){    var newObj = {};    for(var key in obj){        newObj[key] = obj[key]    }    return newObj}var obj_2 = copy(obj_1);obj_2.b = 3;console.log(obj_1)//{a:1,b:2}console.log(obj_2)//{a:1,b:3}

5.对象、数组的深拷贝

var obj_1 = {    school:'哈弗',    grade:{        level_1:[1,2,3]    }}function copy(obj){    if(Object.prototype.toString.call(obj) === '[object Array]'){        var newObj = [];    }else{        var newObj = {};    }    for(var key in obj){        newObj[key] = (typeof obj[key] ==='object' ? copy(obj[key]) : obj[key]);    }    return newObj}var obj_2 = copy(obj_1);obj_2.school = '清华';obj_2.grade.level_1.push(4);console.log(obj_1.school)//哈弗console.log(obj_2.school)//清华console.log(obj_1.grade.level_1)//[1,2,3]console.log(obj_2.grade.level_1)//[1,2,3,4]
原创粉丝点击