本文为学习笔记,参考Javascript.info,菜鸟等文章编写。
跳转连接
Rest 参数 …
在 JavaScript 中,无论函数是如何定义的,都可以在调用它时传入任意数量的参数。
这个函数不会因为传入过多的参数而报错。但是只有本应被接收的参数会被接收。
我们可以在函数定义中声明一个数组来收集参数。语法是这样的:...变量名
,这将会声明一个数组并指定其名称,其中存有剩余的参数。这三个点的语义就是“收集剩余的参数并存进指定数组中”。
function sumAll(...args) { // 数组名为 args
let sum = 0;
for (let arg of args) sum += arg;
return sum;
}
alert( sumAll(1, 2, 3) ); // 6
注意:Rest 参数必须放到参数列表的末尾
"arguments” 变量
有一个名为 arguments
的特殊类数组对象可以在函数中被访问,该对象以参数在参数列表中的索引作为键,存储所有参数。
在过去,JavaScript 中不支持 rest 参数语法,而使用 arguments
是获取函数所有参数的唯一方法。
function showName() {
alert( arguments.length );
alert( arguments[0] );
alert( arguments[1] );
// 它是可遍历的
// for(let arg of arguments) alert(arg);
}
// 依次显示:2,Julius,Caesar
showName("Julius", "Caesar");
// 依次显示:1,Ilya,undefined(没有第二个参数)
showName("Ilya");
但缺点是,尽管 arguments
是一个类数组,也是可迭代对象,但它终究不是数组。它不支持数组方法,因此我们不能调用 arguments.map(...)
等方法。
注意,箭头函数没有 "arguments"
。如果我们在箭头函数中访问 arguments
,访问到的 arguments
并不属于箭头函数,而是属于箭头函数外部的“普通”函数。
Spread 语法
当在函数调用中使用 ...arr
时,它会把可迭代对象 arr
“展开”到参数列表中。
let arr1 = [3, 5, 1];
alert( Math.max(...arr1) ); // 5(spread 语法把数组转换为参数列表)
// 多个可迭代对象
let arr2 = [8, 3, -8, 1];
alert( Math.max(...arr1, ...arr2) ); // 8
// 与常规值结合使用
alert( Math.max(1, ...arr1, 2, ...arr2, 25) ); // 25
可以使用 spread 语法来合并数组
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)
可以用 spread 语法这样操作任何可迭代对象
// 将字符串转换为字符数组
let str = "Hello";
alert( [...str] ); // H,e,l,l,o