JavaScript剩余操作符Rest Operator

本文适合JavaScript初学者阅读

剩余操作符

之前这篇文章JavaScript展开操作符(Spread operator)介绍讲解过展开操作符。剩余操作符和展开操作符的表示方式一样,都是三个点 '…',但是他们的使用场景会不同。

剩余参数

定义函数的时候,如果函数的参数以… 为前缀,则改参数是剩余参数(rest parameter)。剩余参数表示参数个数不确定的参数列表。在函数被调用时,该形参会成为一个数组,数组中的元素都是传递给该函数的多出来的实参的值。

获取参数

剩余操作符可以用来方便地获取传进来的参数。

function sum(a,b,...args){
  console.log(args.length); // 传进来的参数的个数 3
  let s = a + b;
  if(args && args.length){
      args.forEach(i => {s += i});
  }  
 return s;
}
sum(1, 2, 3, 4, 5 ); // 传进来的参数的个数 3

其中第一个形参a对应的是1,第二个形参b对应的2,…args表示的就是[3, 4, 5]。

和arguments的差别

上面剩余参数args是一个数组,而函数的arguments是一个伪数组。应此剩余参数可以使用数组的相关方法sort,map,forEach,pop,而arguments不能。

arguments想要变成数组,可以通过Array.prototype.slice.call方法,使用剩余操作符可以避免将arguments转为数组的麻烦。

// 下面的代码模拟了剩余数组
function sum(a,b,){
  var args = Array.prototype.slice.call(arguments, sum.length);  
  console.log(args.length); // 传进来的参数的个数 3
  let s = a + b;
  args.forEach(i => {s += i});
 return s;
}
sum(1, 2, 3, 4, 5 );


而使用剩余操作符,则不需要转化,直接使用,更加方便。

剩余操作符与解构赋值

我们知道,ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 比如如下代码:

let array = [1,2,3]
let [a,b,c] = array; // a 1, b 2, c 3

再比如如下代码:

let obj = {a:1,b:2,c:3}
let {a,b,c} = obj; // a 1, b 2, c 3

在解构赋值时,可以使用剩余操作符。剩余操作符所操作的变量会匹配在解构赋值中所有其他变量未匹配到的属性。
比如如下代码,others会匹配到first和second对于属性的余下的属性:

const { first, second, ...others } = {
  first: 1,
  second: 2,
  third: 3,
  fourth: 4,
  fifth: 5
}

first // 1
second // 2
others // { third: 3, fourth: 4, fifth: 5 }

对象中余下的属性值被打包起来构造一个新的对象赋值给了others

数组也可以通过剩余操作符,把剩余的元素打包成一个新的数组赋值给剩余属性,代码如下:

let array = [1,2,3,4,5];
let [a,b,...c] = array;  // a 1,b 2, c [3,4,5]

剩余操作符和展开操作符

某种程度上,可以任务剩余操作符是展开操作符的相反操作。展开操作符会”展开“数组编程多个元素,剩余操作符会把多个元素压缩成一个单一的元素。

欢迎关注公众号“ITman彪叔”。彪叔,拥有10多年开发经验,现任公司系统架构师、技术总监、技术培训师、职业规划师。熟悉Java、JavaScript。在计算机图形学、WebGL、前端可视化方面有深入研究。对程序员思维能力训练和培训、程序员职业规划和程序员理财投资有浓厚兴趣。

ITman彪叔公众号

ITman彪叔公众号

<think>我们被要求解释JavaScript中的展开操作符(spread operator),并按照格式在最后提出3-5个相关问题。 展开操作符是ES6引入的语法,用三个点(...)表示,主要用于展开可迭代对象(如数组、对象等)的元素。 以下是对展开操作符的详细说明,包括其在不同场景中的应用。</think>在 JavaScript 中,展开操作符(Spread Operator)使用三个连续的点(`...`)表示,主要功能是将可迭代对象(如数组、对象)"展开"为独立元素。以下是核心应用场景: ### 1. 数组展开 ```javascript // 合并数组 const arr1 = [1, 2]; const arr2 = [3, 4]; const combined = [...arr1, ...arr2]; // [1, 2, 3, 4] // 复制数组(浅拷贝) const original = [1, {a: 2}]; const copy = [...original]; // 函数参数传递 function sum(a, b, c) { return a+b+c; } const nums = [1, 2, 3]; sum(...nums); // 6 ``` ### 2. 对象展开 (ES2018+) ```javascript // 合并对象(重复属性后者覆盖前者) const objA = { a: 1, b: 2 }; const objB = { b: 3, c: 4 }; const merged = { ...objA, ...objB }; // {a:1, b:3, c:4} // 添加/覆盖属性 const updated = { ...objA, b: 99, d: 100 }; // 对象浅拷贝 const shallowCopy = { ...originalObj }; ``` ### 3. 特殊场景应用 - **可迭代对象转换**:将类数组(如`arguments`)转为真实数组 `[...document.querySelectorAll('div')]` - **React/Vue中的props传递**:`<Component {...props} />` - **解构赋值结合**: `const [first, ...rest] = [1, 2, 3]; // first=1, rest=[2,3]` ### 注意事项 1. **浅拷贝特性**:嵌套对象/数组不会被深度复制 2. **执行顺序**:对象展开按从左到右顺序处理(右侧覆盖左侧) 3. **性能影响**:大型数据集展开可能有性能开销 4. **浏览器兼容**:对象展开需ES2018+环境(可通过Babel转译)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值