剩余参数——rest 操作符
剩余运算符(the rest operator),它的样子看起来和展开操作符一样,但是它是 用于解构数组和对象。
rest 操作符可以用于创建有一个变量来接受多个参数的函数。 这些参数被储存在一个可以在函数内部读取的数组中。
用法:rest 操作符语法(...args)
function howMany(...args) {
return "You have passed " + args.length + " arguments.";
}
console.log(howMany(0, 1, 2));
console.log(howMany("string", null, [1, 2, 3], { }));
控制台将显示字符串 You have passed 3 arguments. 和 You have passed 4 arguments.。
使用 rest 参数,就不需要查看 args 数组,并且允许我们在参数数组上使用 map()、filter() 和 reduce()。
剩余参数和arguments的区别
剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参;
- arguments对象不是一个真正的数组,而rest参数是一个真正的数组,可以进行数组的所有操作;
- arguments是早期的ECMAScript中为了方便去获取所有的参数提供的一个数据结构,而rest参数是ES6中提供 并且希望以此来替代arguments的;
注意:剩余参数必须放到最后一个位置,否则会报错
展开语法—— spread 运算符
展开运算符 (spread)是三个点 ( ... ),可以将一个数组转为用逗号分隔的参数序列。
说的通俗易懂点,有点像化骨绵掌,把一个大元素给打散成一个个单独的小元素。
剩余运算符也是用三个点 ( ... )表示,它的样子看起来和展开操作符一样,但是它是用于解构数组和对象。
使用 spread 运算符展开数组项
ES6 引入了_展开操作符_,可以展开数组以及需要多个参数或元素的表达式。
下面的 ES5 代码使用了 apply() 来计算数组的最大值:
var arr = [6, 89, 3, 45];
var maximus = Math.max.apply(null, arr);
//maximus 的值为 89
我们必须使用 Math.max.apply(null, arr)
,因为 Math.max(arr)
返回 NaN。Math.max()
函数中需要传入的是一系列由逗号分隔的参数,而不是一个数组。
且这里使用apply有些不合适,因为我们一般使用apply来指定this。
展开操作符可以提升代码的可读性,使代码易于维护。
const arr = [6, 89, 3, 45];
const maximus = Math.max(...arr);
//maximus 的值应该是 89。
...arr 返回一个解压的数组。 也就是说,它_展开_数组。 然而,展开操作符只能够在函数的参数中或者数组中使用。 下面的代码将会报错:
const spreaded = ...arr;
构建对象字面量时ES2018(ES9)
const names = ["abc", "cba", "nba"]
const info = {name: "why", age: 18}
//构建对象字面量时ES2018(ES9)
const obj = { ...info, address: "广州市", ...names }
console.log(obj)
补充:展开运算符其实进行的是一个浅拷贝
const info = {
name: "why",
friend: { name: "kobe" }
}
const obj = { ...info, name: "coderwhy" }
// console.log(obj)
obj.friend.name = "james"
console.log(info.friend.name)
上面代码在内存中的展示: