复杂数据类型深拷贝的方法
2020-06-26 04:24
225 查看
深拷贝与浅拷贝: 在复制过程中,如果B复制了A,当其中一个改变时,对方会跟着变化的是浅拷贝;对方不会跟着变化的是深拷贝。
注意: 当采用赋值拷贝时,基本数据类型(String、Number、Boolean等)的拷贝是深拷贝,复杂数据类型(Object、Array等)的拷贝是浅拷贝。
在有些时候,我们想对复杂数据类型进行深拷贝,我们可以采取以下几种方法实现复杂数据类型的深拷贝:
1、采用递归
// 利用递归方法实现深拷贝 // 这里要实现 obj2 与 obj1 的深拷贝 var obj1 = { //这是一个复杂数据类型 uname: "abc", age: 18, messige: { dosport: "basketball", music: "aaaa" }, color: ["red", "blue", "green"] }; var obj2 = {}; // 封装一个函数 function deepCopy(newObj, oldObj) { // 传入原对象和新对象 // 用 for……in 遍历对象 for (var k in oldObj) { // 先判断属性的值属于什么类型,如果是简单数据类型则直接赋值,如果是复杂数据类型,则使用递归 // 1、获取属性值,存到一个中间变量上 var item = oldObj[k]; if (item instanceof Array) { // 2、判断属性值是否为数组 newObj[k] = []; // 如果是数组,先让新对象的这个属性为空数组,然后递归实现赋值 deepCopy(newObj[k], item) } else if (item instanceof Object) { // 2、判断属性值是否为对象 newObj[k] = {};// 如果是对象,先让新对象的这个属性为空对象,然后递归实现赋值 deepCopy(newObj[k], item) } else { // 简单数据类型就直接赋值即可 newObj[k] = item } } } deepCopy(obj2, obj1); // 给对象深拷贝 console.log(obj2, obj1); obj1.age = 80; // 改变其中一个的内容,不会影响另外一个 console.log(obj2, obj1);
2、通过JSON来实现
首先了解一下JSON.stringify()和JSON.parse(),可以先简单理解为 JSON.stringify()是将对象转换成字符串,JSON.parse()是将字符串转换成对象。使用JSON.parse(JSON.stringify())可以实现深拷贝,但是需要注意的是这种拷贝方式不能拷贝到对象里面的方法
// 实现数组的深拷贝 var arr = [[1, 2], [3, 4], { name: "aaa", age: 18 }] var newArr = []; newArr = JSON.parse(JSON.stringify(arr)); console.log(arr, newArr); newArr[0][0] = 10000; //改变其中一个的内容,不会影响另外一个 arr[2].age = 80; //改变其中一个的内容,不会影响另外一个 console.log(arr, newArr); // 实现对象的深拷贝 var obj1 = { name: "zhangsan", age: 18, method: function () { console.log("I'm 18 years old"); } }; var obj2 = {}; obj2 = JSON.parse(JSON.stringify(obj1)); // 不能拷贝到原对象里面的方法,也就是 obj2 里面没有 method: function () {console.log("I'm 18 years old");} console.log(obj1, obj2);
3、借用 jQuery的 extend 方法
如果在使用jQuery开发项目,可以利用jQuery的extend方法实现深拷贝
// 要先引入 jQuery 哦 $(function () { var arr1 = [[1, 2], [3, 4], { name: "aaa", age: 18 }] var newArr1 = $.extend(true, [], arr1); // true为深拷贝,false为浅拷贝 console.log(arr1, newArr1); arr1[2].age = 100; // 改变其中一个的内容,不会影响另外一个 console.log(arr1, newArr1); })
相关文章推荐
- ofbiz的webservice接口提供(4)-支持复杂数据类型方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- JNI中基本类型数组的传递方法(无需拷贝数据!!!)
- ofbiz的webservice接口提供(4)-支持复杂数据类型方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(6):服务器端和客户端数据类型的自动转换:复杂类型
- ofbiz的webservice接口提供(4)-支持复杂数据类型方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法:服务器端和客户端数据类型的自动转换:复杂类型
- 在asp.net AJAX客户端使用复杂数据类型方法
- 006 复杂的数据类型&函数(方法)
- Android AIDL使用parcelable复杂数据类型方法
- JS中的两种数据类型及实现引用类型的深拷贝的方法
- ofbiz的webservice接口提供(4)-支持复杂数据类型方法
- ofbiz的webservice接口提供(4)-支持复杂数据类型方法
- CXF webservice JAXB 处理复杂数据类型方法
- ofbiz的webservice接口提供(4)-支持复杂数据类型方法
- ofbiz的webservice接口提供(4)-支持复杂数据类型方法
- 实现多层复杂的数据类型的深拷贝
- Hive中复杂数据类型Map常用方法介绍
- CXF webservice JAXB 处理复杂数据类型方法
- Java学习之数组1(1.数组的声明;2.元素为引用数据类型的数组;3.关于main方法里的String[] args;4.数组排序;5.数3退1 数组算法,(用数组模拟链表);6数组查找之二分法;7数组的拷贝)