深浅 拷贝
所谓的 深拷贝 浅拷贝 是 对 引用 数据类型而言的
如果变量储存的数据是 基本数据类型 例如 字符串,数值,布尔值等
没有所谓的 深浅拷贝
浅拷贝所谓的 浅拷贝 只是 复制变量中存储的内存地址效果是 多个变量 存储相同的 内存地址, 操作相同的存储空间一个变量的操作 会影响所有的变量
// a储存数值100 var a = 100;// 将 a 储存的数据100赋值给bvar b = a;// 将 a 储存的数值修改为北京 不影响b储存的数据a = '北京';// c 储存的是 数组的内存地址var c = [1,2,3,4,5];// 将 c 储存的数组的内存地址 赋值给 变量d储存// 也就是 变量c 和 变量d 储存的是 相同的内存地址// 浅拷贝var d = c;// 本质上 通过 变量c 和 通过 变量d 操作的是 同一个内存地址中存储的数组// 通过变量c 修改 数组 也会影响 变量d c[0] = '北京';console.log( d )
深拷贝所谓的 深拷贝 是 全完复制 引用数据类型存储的数据不仅仅是 复制 引用数据类型的内存地址一般的操作方式是 循环遍历 引用数据类型 完全复制 数据数值
// c 储存的是 数组的内存地址var c = [1,2,3,4,5];// 深拷贝//给e一个空数组var e = [];//把c数组forEach循环遍历 item 拿他的数值 c.forEach( item=>{//把这个数值全部写入到e数组中e.push(item);});// 通过c的修改,不会影响e存储的数据c[0] = '北京';console.log(c);console.log(e);
总结:1, 只有 引用数据类型才有 深浅拷贝基本数据类型没有2, 浅拷贝 复制 引用数据类型的内存地址效果: 多个变量,都存储相同的 内存地址,操作同一个内存空间中存储的引用数据类型一个变量操作,所有变量都受影响3, 深拷贝 复制 引用数据类型存储的具体的数据数值效果: 多个变量,存储不同的内存地址 一个变量操作,不会影响其他变量实际项目中 原生 JavaScript 深浅拷贝 要使用 递归函数实现循环遍历变量 如果 存储的数据 数据类型是:对象,数组,函数就执行 递归函数 进行 深拷贝如果不是 引用类型 就直接 赋值浅拷贝 你变我也变 始终是有一个引用数据类型 拷贝的是地址深拷贝 你变我不变 多个引用数据类型 拷贝的数据数值
** jQuery的深拷贝**
语法:$.extend( 变量1 , 变量2 , 变量3 ); $.extend( true , 变量1 , 变量2 , 变量3 ); 将 变量1 之后 所有变量的数据 都 拷贝 至 变量1中理论上 所有变量 都应该存储 引用书类型也就是 变量2 变量3 都应该是 引用数据类型如果变量2变量3 数据单元存储的是 基本数据类型执行的默认都是 深拷贝 如果变量2变量3 数据单元存储的是 引用数据类型默认执行的是 浅拷贝添加第一个参数是 true 执行的是 深拷贝
<script src="../../../jquery.min.js"></script><script>// 原始的 arr 数组var arr = [1,2,3,4,5,{name:'张三',age:18}];// 创建的新数组arr1var arr1 = [];// 将 arr的数据 复制 给 新数组 arr1// 如果arr数据单元存储的是 引用数据类型 执行浅拷贝$.extend( arr1 , arr );var arr2 = [];// 如果arr数据单元存储的是 引用数据类型 执行深拷贝$.extend( true , arr2 , arr );// 索引0 原始存储的是 数值1 是基本数据类型// 默认都是执行 深拷贝 // 也就是 原始arr 操作 arr1 和 arr2 拷贝的数据 不受影响arr[0] = '北京';// 索引5 原始存储的是 对象 是 引用数据类型// 默认执行的是 浅拷贝// 添加第一个参数true 执行的才是深拷贝// arr操作对象,不会对深拷贝产生影响arr[5].name = '李四';console.log( arr );console.log( arr1 );console.log( arr2 );</script>