ES6函数新增的扩展

一、参数

  • 参数设置默认值(设置了默认参数的参数不可不传参,函数的形参是默认声明的不可使用let,const再次声明)
  • 剩余参数(收集所有剩余的不定量参数为一个数组)
  • 参数使用扩展运算符
  • 参数的默认值可以和解构赋值的默认值配合使用(使用场景:适合函数接收对象或数组参数时,直接提取所需的值,减少冗长代码。)
javascript 复制代码
function greet(name = 'World') {
    console.log(`Hello, ${name}!`);
}

// 函数的形参是默认声明的不可使用let,const再次此声明
function greet(name = 'World') {
    let name = 'lili' // error
    const name = 'lili' // error
    console.log(`Hello, ${name}!`);
}

// 剩余参数
function sum(...numbers) {
    return numbers.reduce((acc, curr) => acc + curr, 0);
}

// 参数使用扩展运算符
function add(a, b) {
    return a + b;
}
const numbers = [1, 2];
console.log(add(...numbers)); // 输出 3

// 参数默认值配合解构赋值默认值配合使用
function foo({x, y = 5}) {
    console.log(x, y);
}

foo({})              // undefined 5
foo({x: 1})          // 1 5
foo({x: 1, y: 2})    // 1 2
foo()                // TypeError: Cannot read property 'x' of undefined

二、属性

  • 函数的name属性(函数名通过name属性暴露出来,用于调试或递归。)
  • 函数的length属性(返回没有指定默认值的参数的个数。注意:rest参数也不会记入length属性,如果设置了默认值的参数不是尾参数,那么 length 属性也不再计入后面的参数了)
javascript 复制代码
// name
function foo {}
console.log(foo.name); // "foo"

// length
(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2

// rest参数也不会记入length属性
(function(...args) {}).length // 0

// 如果设置了默认值的参数不是尾参数,那么 length 属性也不再计入后面的参数了
(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1

三、作用域

函数内为块级作用域

四、严格模式

use strict

注意:当函数参数使用了默认值解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错。

javascript 复制代码
//报错
function doSomething(a, b = a) {
    'use strict';
    // code
}

//报错
const doSomething = function ({a, b}) {
    'use strict';
    // code
};

//报错
const doSomething = (...a) => {
    'use strict';
    // code
};

const obj = {
    //报错
    doSomething({a, b}) {
        'use strict';
        // code
    }
};

五、箭头函数

箭头函数提供了一种更简洁的方式来写函数表达式。它们不绑定自己的thisargumentssuper,或new.target。这些函数最适合非方法函数,并且它们不能用作构造函数。

注意点

  • 函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象
  • 不可以当作构造函数,也就是说,不可以使用 new命令,否则会抛出一个错误
  • 不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替
  • 不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数

六、尾调用优化

虽然尾调用优化不是直接与函数定义相关,但它是在ES6中引入的一个重要概念,旨在提高递归函数的性能。通过在函数的最后调用自身,可以减少调用栈的使用,从而避免栈溢出错误。现代JavaScript引擎已经开始支持尾调用优化。

scss 复制代码
function factorial(n, acc = 1) {
    if (n <= 1) return acc;
    return factorial(n - 1, n * acc);
}
相关推荐
pandarking几秒前
[CTF]攻防世界:web-unfinish(sql二次注入)
前端·数据库·sql·web安全·ctf
IT_陈寒几秒前
Java并发编程避坑指南:从volatile到ThreadLocal,8个实战案例解析线程安全核心原理
前端·人工智能·后端
ByteCraze6 分钟前
前端性能与监控指标采集系统设计方案
前端
山楂树の11 分钟前
前端实时渲染性能优化 使用cocoRLE编码进行图像传输并着色绘制
前端·图像处理·实时互动
程序员祥云12 分钟前
云希谷技术面
前端
一 乐19 分钟前
心理健康管理|基于springboot + vue心理健康管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
G***E31620 分钟前
重塑前端的力量:从界面承载到体验驱动的全链路能力进化
前端
HIT_Weston20 分钟前
60、【Ubuntu】【Gitlab】拉出内网 Web 服务:Gitlab 配置审视(四)
前端·ubuntu·gitlab
G***E31621 分钟前
前端技术的下一场深变:从工程化到智能化的全面升级
前端
前端小端长21 分钟前
深入理解Composition API与Vue3.0响应式原理
开发语言·javascript