js数组操作⽅法concat
concat⽤于连接两个或者多个数组,该⽅法不会改变现有的数组,⽽仅仅会返回被连接数组的⼀个副本。
语法:at(arrayX,arrayX,…,arrayX)
基本⽤法
let arr1 =[1,2,3,4];
let arr2 =[2,3,4,5];
console.at(arr2));
// 输出:[1, 2, 3, 4, 2, 3, 4, 5]
let number =1;
let concat1 = at(number)
console.log(concat1);
// 输出:[1, 2, 3, 4, 1]
这样的使⽤⽅式通常⽤来合并数组或者向数组末端添加元素,有⼀点像push()⽅法,区别在于push()⽅法操作的是原数组,但是concat()会返回⼀个新的数组。
简单数组的连接
concat⽅法会创建⼀个新的数组,数组/值在连接时保持不变。此外,对于新数组的任何操作(仅当元素不是对象引⽤时)都不会对原始数组产⽣影响,反之亦然。
也就是说concat是⼀个浅拷贝,但是在简单数组的场景下它像⼀个深拷贝。
let arr1 =[1,2,3,4];
let arr2 =[2,3,4,5];
let concat1 = at(arr2);
console.log(concat1);
// 输出:[1, 2, 3, 4, 2, 3, 4, 5]
arr2[0]=11
console.log(concat1);
// 输出:[1, 2, 3, 4, 2, 3, 4, 5]
从代码⾥可以看到当arr2数组发⽣变化时concat1数组并没有发⽣变化,在数组为简单数组的场景下concat可以⽤作深拷贝。
复杂数组的连接(场景⼀)
let arr1 =[1,2,3,4];
let arr2 =[[2,3],4,5];
javascript全局数组
let concat1 = at(arr2);
console.log(concat1);
// 输出:[1, 2, 3, 4, [2, 3], 4, 5]
arr2[0][0]=11
console.log(concat1);
// 输出:[1, 2, 3, 4, [11, 3], 4, 5]
当连接复杂数组时,修改arr2时,concat1数组会发⽣变化,所以,严格意义上concat()是⼀种浅拷贝,只是在某些场景下看着像⼀个深拷贝。
复杂数组的连接(场景⼆)
let arr1 =[1,2,3,4];
let arr2 =[[2,3],4,5]
let concat1 = at(arr1);
console.log(concat1);
// 输出[[2,3],4,5,1,2,3,4]
arr2[0]=[20,30];
console.log(concat1);
// 输出[[2,3],4,5,1,2,3,4]
现在的场景下,当arr2数组发⽣变化时,concat1数组没有被影响,当前的场景和场景⼀很相似,只是变更值的维度不同,场景⼀修改的是数组第⼆个维度下的值,当前场景修改的是第⼀个纬度下的值。
深拷贝和浅拷贝遇见concat()
通常深拷贝和浅拷贝之说是对于引⽤数据类型⽽⾔的,引⽤数据类型的名和值分别存储在栈和堆中,在栈中有⼀个地址可以的到堆。
浅拷贝时,复制的是栈中的地址,然后通过地址到堆,获取堆中的数据。因此当堆中的值发⽣变化以后,所有指向该堆的栈通过地址到的值都会发⽣变化。
使⽤concat()⽅法时会返回⼀个新数组,可以理解为concat()创建和新的堆,堆中的值与连接数组的值是相同的,因此在简单数组的场景下,修改原数组,concat()⽅法返回的新数组的值不会被影响。但是在复杂数组的场景下,因为数组有多个维度,⽽concat()没有递归操作,所以concat()只能是第⼀维度的深拷贝,当连接维度⼤于1的数组时,并没有创建新的栈和堆去存储第⼆维度数组中值,只是创建了⼀个新的栈去指向第⼆维度的数组,此时第⼆维度数组内的存放数据的堆是同⼀个,因此当堆中的值发⽣改变时,所有指向该堆的栈所拿到的值都会发⽣变化。
上述为个⼈理解,如有错误,请指正

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。