ES6入门教程笔记(6)-函数的扩展

ゝ一世哀愁。 2022-03-21 05:46 415阅读 0赞

1 函数参数的默认值

基本用法

ES6之前,函数参数不能指定默认值,只能用变通的方法。

  1. function print(x, y) {
  2. y = y || 'World';
  3. console.log(x, y);
  4. }
  5. print('Hello') // "Hello World"
  6. print('Hello', 'Gamer') // "Hello Gamer"
  7. print('Hello', false); // "Hello World"

上面代码中,print函数内部检查参数y有没有赋值,如果没有,则指定默认值为World。但这种写法有个缺陷,就像最后一行代码所示,如果给参数y传的值为false,则该赋值不起作用,将被改为默认值。

为避免这个问题,通常是先判断参数y是否被赋值,如果没有,再赋给默认值。

  1. if (typeof y === 'undefined') {
  2. y = 'World';
  3. }

在ES6中,允许为函数的参数设置默认值,即直接写在参数定义的后面。

  1. function print(x, y = 'World') {
  2. console.log(x, y);
  3. }
  4. print('Hello') // "Hello World"
  5. print('Hello', 'Gamer') // "Hello Gamer"
  6. print('Hello', false); // "Hello false"

可以看到,ES6的写法比ES5简洁很多,而且非常自然。

除此之外,ES6的写法还有两个好处:首先,阅读代码的人无需查看函数体或文档,就可以立即了解哪些参数是可以省略的。其次,有利于将来的代码优化,即使未来彻底去掉这个参数,也不影响旧代码的运行。

与解构赋值默认值结合使用

参数默认值可以与解构赋值的默认值,结合起来使用。

  1. function print({ x, y = 10}) {
  2. console.log(x, y);
  3. }
  4. print({ }) // undefined 10
  5. print({ x:1}) // 1 10
  6. print({ x:1 y:2}) // 1 2
  7. print() // TypeError

上面代码中,只有当参数是一个对象时,变量x和y才会通过解构赋值生成。如果没有提供参数,将会报错。

通过提供函数参数的默认值,可以避免这种情况。

  1. function print({ x, y = 10} = { }) {
  2. console.log(x, y);
  3. }
  4. print() // undefined 10

上面代码中,调用print没有提供参数,被默认为一个空对象。

参数默认值的位置

通常情况下,定义了默认值的参数,应该是函数的尾参数。如果非尾部,这个参数将没法省略,除非显式输入undefined

函数的length属性

函数的length属性,将返回没有指定默认值的参数个数。

2 rest参数

ES6引入了rest参数,用来获取函数的多余参数。

  1. function add(...values) {
  2. let sum = 0;
  3. for (let val of values) {
  4. sum += val;
  5. }
  6. return sum;
  7. }
  8. add(2, 5, 3) // 10

上面代码中的add函数,利用rest参数,可以传入任意数目的参数。

3 严格模式

从ES5开始,函数内部可以设定为严格模式。

  1. function func(a, b) {
  2. 'use strict';
  3. // code
  4. }

ES6规定,如果函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能再设定为严格模式,否则报错。

要规避这种限制,有一种方法是设定全局性的严格模式,这是合法的。

  1. 'use strict';
  2. function func(a, b = a) {
  3. // code
  4. }

注:本文原始内容来自 ES6标准入门,有修改。

发表评论

表情:
评论列表 (有 0 条评论,415人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ES6-函数扩展

    ES6对函数的扩展总要将两件事,一个是函数的参数,一个是箭头函数,这两点扩展为JS代码编写来说是两个大大的惊喜,未来我们会经常用到这两个新特性。 ES6中函数的参数 与

    相关 ES6入门教程笔记(9)-对象扩展

    ES6对对象的扩展非常多,本文只介绍自己感兴趣的若干,需要完整的请阅读文末原文。 属性的简洁表示法 ES6允许直接写入变量和方法,作为对象的属性和方法。这种写法更加简洁

    相关 ES6 函数扩展

    参数默认值 如果没有向某个形参传入对应的实参(即实参为`undefined`),该参数就会取值为定义好的默认值(如果有的话)。 `null`被认为是有效的值传递。