本文详细解析JavaScript中数组与对象的深浅拷贝原理,区分内存地址与数值数据的复制差异。重点阐述jQuery中$.extend()方法的特殊行为:默认执行一维深拷贝、二维浅拷贝,并通过示例代码展示其具体语法与使用场景。
在引用数据类型(如数组和对象)的复制过程中,深浅拷贝机制会引发不同的数据共享问题。
JS的浅拷贝
直接复制操作针对的是数组或对象的内存地址。由于本质上是引用数据类型,所有变量存储的都是相同的内存地址,指向同一个存储空间。因此,对任意一个变量进行修改,其他关联变量也会同步受到影响。具体表现如下:
const arr1 = ['北京', '上海', '广州', '深圳', '武汉'];
const arr2 = arr1;
console.log(arr1);
console.log(arr2);变量arr1中存储的是数组的内存地址。浅拷贝操作将该内存地址赋值给变量arr2,使得arr2与arr1指向同一内存空间。此时,通过任一变量操作数组,另一变量也会随之改变。例如,将arr1中的“北京”修改为“天津”,arr2中对应的元素也会变为“天津”。
JS的深拷贝
深拷贝复制的是数组或对象内部存储的具体数值数据。执行深拷贝会创建新的引用数据类型,每个拷贝拥有独立的内存地址和存储空间。因此,对一个变量的操作不会影响其他变量。具体表现如下:
const arr1 = ['北京', '上海', '广州', '深圳', '武汉'];
//创建一个新的引用数据类型
const arr3 = [];
//循环遍历arr1将arr1中的存储获取之后,存储到arr3中
arr1.forEach(item => {
arr3.push( item );
})arr3拥有新的内存地址,仅存储与arr1相同的数值数据。arr1的操作作用于其自身的内存空间,与arr3无关。例如,将arr1中的“上海”修改为“成都”,arr3中的数值保持不变;同样,修改arr3的数据也不会影响arr1。
jQuery的深浅拷贝
jQuery中的深浅拷贝机制具有特殊性,与传统JavaScript实现有所不同。
首先,jQuery并未封装传统意义上的纯浅拷贝函数。
其次,jQuery提供的$.extend()方法默认执行的是传统意义上的深拷贝逻辑。
此外,jQuery所谓的深浅拷贝特指:对一维数据进行深拷贝,而对二维及多维数据执行浅拷贝。
jQuery中深浅拷贝的具体语法形式如下所示:
const 变量 = 数组/对象;
$.extend(变量 , 原始数组/对象);
//浅拷贝,一维数据 深拷贝,多维数据 浅拷贝
$.extend(true, 变量, 原始数组/对象);
//深拷贝,一维数据 多维数据 都是深拷贝具体代码示例如下:
//原始数组
const arr1 = ['北京' , '上海' , '广州' , '深圳' , '武汉' , [100,200,300,400] , {name:'王昭没有君啊' , age:22 , sex:'男'} ];
//jQuery的浅拷贝
//创建一个arr2
const arr2 = [];
//将arr1中的数据按照jQuery的浅拷贝语法复制到arr2中
//执行的是jQuery的浅拷贝
$.extend( arr2 , arr1 );
//创建一个arr2
const arr3 = [];
//将arr1中的数据按照jQuery的深拷贝语法复制到arr3中
//执行的是jQuery的深拷贝
$.extend(true, arr3, arr1);总结
本文到此结束,希望能为读者提供有益的帮助,也欢迎大家关注本站以获取更多精彩内容!