一、扩展运算符:...
扩展运算符(spread)是三个点(...
)该运算符主要用于函数调用。将扩展运算符后面的内容扩展开来
数组的扩展运算符:
举例:将一个数组转为用逗号分隔的参数序列。
console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]
扩展运算符与正常的函数参数可以结合使用,非常灵活。
function f(v, w, x, y, z) { }
const args = [0, 1];
f(-1, ...args, 2, ...[3]);
扩展运算符后面还可以放置表达式。
const arr = [
...(x > 0 ? ['a'] : []),
'b',
];
注意,只有函数调用时,扩展运算符才可以放在圆括号中,否则会报错。
(...[1, 2])
// Uncaught SyntaxError: Unexpected number
console.log((...[1, 2]))
// Uncaught SyntaxError: Unexpected number
console.log(...[1, 2])
// 1 2
对象的扩展运算符:
对象的扩展运算符(...
)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。
let z = { a: 3, b: 4 };
let n = { ...z };
n // { a: 3, b: 4 }
扩展运算符后面是整数1
,会自动转为数值的包装对象Number{1}
。由于该对象没有自身属性,所以返回一个空对象。
// 等同于 {...Object(true)}
{...true} // {}
// 等同于 {...Object(undefined)}
{...undefined} // {}
// 等同于 {...Object(null)}
{...null} // {}
但是,如果扩展运算符后面是字符串,它会自动转成一个类似数组的对象,因此返回的不是空对象。
{...'hello'}
// {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
二、剩余运算符:...
前面的参数拿走剩下的参数,都是剩余运算符的包含的内容:
用于数组:
let[...aa]=[1,2,3];//...剩余运算符:全部都要
console.log(aa);//返回数组[1,2,3]
let[bb,...cc]=[1,2,3];
console.log(bb,cc)//1 [2, 3]
let[qq,...ww]=[1];
console.log(qq,ww);//1 []
// 剩余运算符只能写在最后,写其他位置会报错
用于函数:
function f1(a,...r){
console.log(a,r);//a=1,r=[2,3,4]
}
f1(1,2,3,4);
注意:剩余参数必须是写在最后一个,否则会报错
三、rest参数:...rest
ES6 引入 rest 参数(形式为...变量名
),用于获取函数的多余参数,这样就不需要使用arguments
对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。(类似于剩余运算符)
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 1
上面代码的add
函数是一个求和函数,利用 rest 参数,可以向该函数传入任意数目的参数。
注意:rest 参数之后不能再有其他参数(即只能是最后一个参数),否则会报错。
// 报错
function f(a, ...b, c) {
// ...
}
函数的length
属性,不包括 rest 参数。
(function(a) {}).length // 1
(function(...a) {}).length // 0
(function(a, ...b) {}).length // 1