每天3分钟,重学ES6-ES12(四)函数的补充 展开语法

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

每天3分钟,重学ES6-ES12文章汇总

前言

今天开始和大家一起系统的学习ES6+,每天3分钟,用一把斗地主的时间,重学ES6+,今天介绍的是函数的补充 展开语法

函数的默认参数

  • 在ES6之前,我们编写的函数参数是没有默认值的,所以我们在编写函数时,如果有下面的需求:

    • 传入了参数,那么使用传入的参数;
    • 没有传入参数,那么使用一个默认值;
  • 而在ES6中,我们允许给函数一个默认值:

代码演示

```js // ES5以及之前给参数默认值 /** * 缺点: * 1.写起来很麻烦, 并且代码的阅读性是比较差 * 2.这种写法是有bug */ function foo(m, n) { m = m || "aaa" n = n || "bbb"

console.log(m, n) }

// 1.ES6可以给函数参数提供默认值 function foo(m = "aaa", n = "bbb") { console.log(m, n) }

// foo() foo(0, "")

```

函数默认值的补充

  • 默认值也可以和解构一起来使用:
  • 另外参数的默认值我们通常会将其放到最后(在很多语言中,如果不放到最后其实会报错的):

    *但是JavaScript允许不将其放到最后,但是意味着还是会按照顺序来匹配;

  • 另外默认值会改变函数的length的个数,默认值以及后面的参数都不计算在length之内了。

代码演示

```js // 1.对象参数和默认值以及解构 function printInfo({name, age} = {name: "why", age: 18}) { console.log(name, age) }

printInfo({name: "kobe", age: 40})

// 另外一种写法 function printInfo1({name = "why", age = 18} = {}) { console.log(name, age) }

printInfo1()

// 2.有默认值的形参最好放到最后 function bar(x, y, z = 30) { console.log(x, y, z) }

// bar(10, 20) bar(undefined, 10, 20)

// 3.有默认值的函数的length属性 function baz(x, y, z, m, n = 30) { console.log(x, y, z, m, n) }

console.log(baz.length) // 打印 4

```

函数的剩余参数

ES6中引用了rest parameter,可以将不定数量的参数放入到一个数组中:

  • 如果最后一个参数是 ... 为前缀的,那么它会将剩余的参数放到该参数中,并且作为一个数组;

  • 那么剩余参数和arguments有什么区别呢?

    • 剩余参数只包含那些没有对应形参的实参,而 arguments 对象包含了传给函数的所有实参;

    • arguments对象不是一个真正的数组,而rest参数是一个真正的数组,可以进行数组的所有操作;

    • arguments是早期的ECMAScript中为了方便去获取所有的参数提供的一个数据结构,

    • 而rest参数是ES6中提供 并且希望以此来替代arguments的;

    • 剩余参数必须放到最后一个位置,否则会报错。

      代码演示

```js function foo(...args, m, n) { console.log(m, n) console.log(args)

console.log(arguments) }

foo(20, 30, 40, 50, 60) // 报错 // Uncaught SyntaxError: Rest parameter must be last formal parameter

// rest paramaters必须放到最后 // Rest parameter must be last formal parameter

function foo(m, n = m + 1) { console.log(m, n) }

foo(10);

```

展开语法

  • 展开语法(Spread syntax):

    • 可以在函数调用/数组构造时,将数组表达式或者string在语法层面展开;

    • 还可以在构造字面量对象时, 将对象表达式按key-value的方式展开;

  • 展开语法的场景:

    • 在函数调用时使用;

      • 在数组构造时使用;

      • 在构建对象字面量时,也可以使用展开运算符,这个是在ES2018(ES9)中添加的新特性;

  • 注意:展开运算符其实是一种浅拷贝;

代码演示

```js const names = ["abc", "cba", "nba"] const name = "why" const info = {name: "why", age: 18}

// 1.函数调用时 function foo(x, y, z) { console.log(x, y, z) }

// foo.apply(null, names) foo(...names) //打印 abc cba nba foo(...name) // 打印 w h y

// 2.构造数组时 const newNames = [...names, ...name] console.log(newNames) //打印 ['abc', 'cba', 'nba', 'w', 'h', 'y']

// 3.构建对象字面量时ES2018(ES9) const obj = { ...info, address: "广州市", ...names } console.log(obj) // 打印 {0: 'abc', 1: 'cba', 2: 'nba', name: 'why', age: 18, address: '广州市'} // 数组被展开

``` 点赞.webp

最后,这是我第一次参加更文活动,茫茫人海中,如果有幸遇到你,读到我这篇文章,那真是太好了。我深知还有很多不足,希望大家能多提建议,还是想舔着脸皮,向屏幕前的大帅比们,大漂亮们,恳请一个小小的点赞,这会是对我莫大鼓励。也祝愿点赞的大帅比们,大漂亮们升职加薪走向人生巅峰!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值