ES6 - 函数的扩展

23 阅读3分钟

函数的扩展

前言

  • 关于 ES6 的新增内容,第一:知道有什么,第二:知道怎么写

  • 本文主要作用在于第一点,知道有什么。达到,在工作中遇到时,能够联想到 ES6,所以仅展示常用内容及简单示例。若所有内容都展示,相当于复制一份文档,没有任何意义。

  • 如果需要详细内容,文档链接 : es6.ruanyifeng.com/

参数默认值

  1. 基本用法

function log(x, y = 'y') {
  console.log(x, y)
}
log('x') // x y
  1. 配合 解构赋值 使用(思考一下下面两者的不同)

function m1({ x = 0, y = 0 } = {}) {
  return [x, y]
}
function m2({ x, y } = { x: 0, y: 0 }) {
  return [x, y]
}

// 注:不要与 解构赋值的默认值 混淆了。
// (第一个函数的参数:解构赋值默认值 + 参数默认值;第二个函数:参数默认值,没有解构赋值默认值。)
  1. 位置的影响

  2. 函数的 length 属性

  3. 作用域

  4. 应用

链接:es6.ruanyifeng.com/#docs/funct…

rest 参数(...变量名)

// 获取多余参数,替代 arguments。
function f2(x, ...values) {
  console.log(values)
}
f2(1, 2, 3) // [ 2, 3 ]
// 值是纯数组,可以使用数组原型的所有方法 forEach、sort 等等

严格模式

function(){
  'use strict'
}
// 如果函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错

name 属性

function foo() {}
console.log(foo.name) // foo

箭头函数

  1. 没有自己的 this

  2. 不能当作构造函数(没有 this)

  3. 不能作为 Generator 函数

  4. 没有 arguments,用 rest 代替

const f = () => 1

尾调用优化、尾递归

尾调用优化 (Tail Call Optimization, TCO),一种减少非必要调用帧的优化   现在仅 Safari 浏览器,且在开启严格模式下才支持

函数调用自身,称为递归。如果尾调用自身,就称为尾递归

// 尾递归计算阶乘,查看浏览器是否支持尾调用优化

'use strict'
// 计算阶乘,若开启 TCO,即使 n 很大也不会栈溢出
function factorial(n, acc = 1) {
  if (n <= 1) return acc
  return factorial(n - 1, n * acc)
}
try {
  // 测试较大的 n,未开启 TCO 会抛出 RangeError: Maximum call stack size exceeded
  console.log(factorial(100000))
  console.log('当前浏览器支持 ES6 尾调用优化')
} catch (e) {
  console.log('当前浏览器不支持 ES6 尾调用优化,错误信息:', e.message)
}

更多信息:斐波那契数列、蹦床函数、尾递归优化的实现

es6.ruanyifeng.com/#docs/funct…

参数的尾逗号(ES2017)

// 只是为了查看代码修改记录时,不至于因为加了一个逗号,就显示有更改记录
function(
  param1,
  param2, // 参数末尾这里可以写逗号
){ /* ... */ }

Function.prototype.toString() (ES2019)

function /* foo comment */ foo () {}

// 修改前的返回,不包含注释,函数名后的空格
foo.toString() // function foo() {}

// 修改后的返回,保留注释,函数名后的空格
foo.toString() // "function /* foo comment */ foo () {}"

catch 参数的省略 (ES2019)

// 修改前,catch 必须有参数
try {
  // ...
} catch (err) {
  // ...
}

// 修改后,可以省略不写
try {
  // ...
} catch {
  // ...
}