rest参数与spread语法
rest参数指的是这样的结构:
function sumAll(...args) { // 数组名为 args
let sum = 0;
for (let arg of args) sum += arg;
return sum;
}
alert( sumAll(1) ); // 1
alert( sumAll(1, 2) ); // 3
alert( sumAll(1, 2, 3) ); // 6
以上的…args传参的方式就是rest参数,这种形式的传参可以解决不固定参数的情况,而且值得注意的是,传入的不固定数量的参数是可以进行循环解构的!
在没有rest之前我们可以利用arguments来获取传入的参数,但是arguments并非是一个数组,所以关于数组的方法比如map就不适用,注意的一点就是rest参数需要放在末尾。
spread语法:
let arr = [3, 5, 1];
alert( Math.max(...arr) ); // 5(spread 语法把数组转换为参数列表)
以上结构属于spread语法,展示了一个返回数组中最大值的操作,…arr将数组中的值进行结构并导入Math.max方法中。
这种语法需要注意的点有以下几种;
一、
let arr1 = [1, -2, 3, 4];
let arr2 = [8, 3, -8, 1];
alert( Math.max(...arr1, ...arr2) ); // 8
我们可以对多个数组进行解构。
二、
let arr = [3, 5, 1];
let arr2 = [8, 9, 15];
let merged = [0, ...arr, 2, ...arr2];
alert(merged); // 0,3,5,1,2,8,9,15(0,然后是 arr,然后是 2,然后是 arr2)
可以对数组进行合并。
三、
let str = "Hello";
alert( [...str] ); // H,e,l,l,
对于字符串依然可以使用。
四、
let arr = [1, 2, 3];
let arrCopy = [...arr]; // 将数组 spread 到参数列表中
// 然后将结果放到一个新数组
// 两个数组中的内容相同吗?
alert(JSON.stringify(arr) === JSON.stringify(arrCopy)); // true
// 两个数组相等吗?
alert(arr === arrCopy); // false(它们的引用是不同的)
// 修改我们初始的数组不会修改副本:
arr.push(4);
alert(arr); // 1, 2, 3, 4
alert(arrCopy); // 1, 2, 3
对数组进行深拷贝