发表于: 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]




返回列表 返回列表
评论

    分享到