ES6中新增的rest剩余参数在函数内部的使用问题

简介: ES6 中引入了 rest 参数(...变量名),用于获取函数内不确定的多余参数,注意只能放在所有参数的最后一个

ES6 中引入了 rest 参数(...变量名),用于获取函数内不确定的多余参数,注意只能放在所有参数的最后一个:

function restFunc(...args) {
   
  console.log(args)
  console.log(arguments)
  for (var a of args) {
   
  }
}

restFunc(2, 5, 8)
// [ 2, 5, 8 ]
// [Arguments] { '0': 2, '1': 5, '2': 8 }

剩余参数和 arguments 对象的区别

  • 剩余参数只包含没有对应形参的实参,arguments 包含函数的所有实参
  • 剩余参数是一个真正的数组,arguments 是一个类数组对象,不能直接使用数组的方法
  • arguments 不能在箭头函数中使用

在函数内部的怎么使用剩余参数

剩余参数我们大都用在一些公共的封装里面,经常配合闭包、call、apply、bind 这些一块使用,对于这几个的使用差异很容易把人绕晕。

  • 1、直接通过变量名取值、遍历
    如果是直接在函数内部获取参数,或者遍历取出参数,我们直接用变量名就行了,注意不需要额外加 ...
    ```js
    function restFunc(...args) {
    console.log(args[0])
    }

restFunc(2) // 2


* 2、在闭包函数中配合 call、bind 使用
这里在函数内部用 call、bind 去改变 this 指向
```js
function callFunc(func) {
  return function(...args) {
    func.call(this, ...args)
  }
}

注意 call、bind 接收的参数也是我们正常看到的函数用逗号分隔开的一个一个的参数,但是因为我们拿到的剩余参数其实是一个数组,所以这里的三个点并不是指和上面的剩余参数一样,而是将参数数组展开,是数组的展开运算符,有点晕的看下面 demo:

function func(num) {
   
  console.log(arguments)
}

const arr = [2, 3, 4]
func(1, ...arr) // [Arguments] { '0': 1, '1': 2, '2': 3, '3': 4 }

虽然这两个长的一样,但是不是同一个东西,只要记住:...剩余参数是用在定义函数时,...展开参数是用在函数调用时(bind 要单独记下)。

  • 3、在闭包函数中配合 apply 使用
    示例和上面的 call、bind 类似,不过注意 apply 接收的参数本来就是一个数组或类数组,所以这里并不需要额外用展开运算符去展开剩余参数:
    function applyFunc(func) {
         
    return function(...args) {
         
      func.apply(this, args)
    }
    }
    
相关文章
|
6天前
|
编解码 JavaScript 前端开发
ES6 字符串的新增方法
ES6 字符串的新增方法
|
6天前
|
网络架构
ES6中数组新增了哪些扩展?
ES6中数组新增了哪些扩展?
45 1
ES6新增操作字符串的七种方法
ES6新增操作字符串的七种方法
|
6天前
|
网络架构
ES6函数新增了哪些扩展?
ES6函数新增了哪些扩展?
30 0
|
6天前
ES6对象新增了哪些扩展?
ES6对象新增了哪些扩展?
38 0
|
6天前
|
JavaScript 前端开发 索引
es6 数组新增哪些方法以及使用场景
es6 数组新增哪些方法以及使用场景
25 0
|
6天前
|
Serverless API
阿里云函数计算调用API输出为空可能有以下几个原因:
阿里云函数计算调用API输出为空可能有以下几个原因:
68 1
|
6天前
|
Serverless API 网络安全
函数计算为什么调用API输出为空?
函数计算为什么调用API输出为空?
132 1
|
5月前
|
JavaScript 前端开发
ES6学习(四)—字符串的新增方法
ES6学习(四)—字符串的新增方法
|
9月前
|
网络架构
ES6中函数新增了哪些扩展?
ES6允许为函数的参数设置默认值