发表于: 2019-06-07 20:21:59
1 740
编辑日报内容...
今天完成的事情:
1.继续学习JavaScript高级程序设计
2.继续学习jquery
3.继续js任务2,3,4
明天计划的事情:
1.继续学习JavaScript高级程序设计
2.继续学习jquery
3.继续js任务2,3,4
遇到的问题:
暂无
收获:
如何实现数组深拷贝和浅拷贝?
在JavaScript中,对于Object和Array这类引用类型值, 当从一个变量向另一个变量复制引用类型值时,这个值的副本其实是一个指针, 两个变量指向同一个堆对象,改变其中一个变量,另一个也会受到影响。 这种拷贝分为两种情况:拷贝引用和拷贝实例,也就是我们说的浅拷贝和深拷贝
2.知识剖析
基本类型:
5种基本数据类型Undefined、Null、Boolean、Number 和 String, 变量是直接按值存放的,存放在栈内存中的简单数据段,可以直接访问。
引用类型:
存放在堆内存中的对象,变量保存的是一个指针,这个指针指向堆内存的相对应的位置。 当需要访问引用类型(如对象,数组等)的值时,首先从栈中获得该对象的地址指针, 然后再从堆内存中取得所需的数据。
在JavaScript中,对于Object和Array这类引用类型值, 当从一个变量向另一个变量复制引用类型值时,这个值的副本其实是一个指针, 两个变量指向同一个堆对象,改变其中一个变量,另一个也会受到影响。 这种拷贝分为两种情况:拷贝引用和拷贝实例,也就是我们说的浅拷贝和深拷贝
3.常见问题
如何实现数组深拷贝和浅拷贝?
4.解决方案
JS数组的浅拷贝
简单的赋值就是浅拷贝。因为对象和数组在赋值的时候都是引用传递。赋值的时候只是传递一个指针。
var a = [1,2,3];
var b = a;
b[0]='a';
console.log (a,b) //['a',2,3] ['a',2,3]
JS数组的深拷贝
slice(): 语法:arrayObject.slice(start,end) slice() 方法可从已有的数组中返回选定的元素(请注意,该方法并不会修改数组,而是返回一个子数组)。
start:必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。
end:可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
返回值:返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素(如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素)。
var a = [1,2,3,4,5];
var b = a.slice(0,2);
var c= a.slice(-3,-1);
var d = a.slice(-1,-3);
console.log (b,c,d) //[1,2] [3,4] [ ]
concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
【语法】arrayObject.concat(arrayX,arrayy,......,arrayN)
【参数】arrayX--必需:该参数可以是具体的值,也可以是数组对象。可以是空值,可以是任意多个。
【说明】 返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat()操作的参数是数组,那么添加的是数组中的元素,而不是数组。
var a = [1,2,3];
var b = a.concat(4,5);
console.log(b)//[1,2,3,4,5]
评论