首页 > web前端 > js教程 > ECMAScript6函数默认参数_javascript技巧

ECMAScript6函数默认参数_javascript技巧

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-05-16 15:55:37
原创
1148 人浏览过

语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷。

我们经常会这么写

1

2

3

4

5

6

function calc(x, y) {

  x = x || 0;

  y = y || 0;

  // to do with x, y

  // return x/y

}

登录后复制

简单说就是x,y提供了一个默认值为0,不传时x, y以值0来运算。传了就以实际值计算。

又如定义一个ajax

1

2

3

4

5

function ajax(url, async, dataType) {

  async = async !== false

  dataType = dataType || 'JSON'

  // ...

}

登录后复制

自己用原生JS封装的一个简易ajax函数,url必填,async和dataType可选,即不填时默认同步请求和返回JSON格式数据。

再如定义一个矩形类

1

2

3

4

function Rectangle(width, height) {

  this.width = width || 200;

  this.height = height || 300;

}

登录后复制

new时不传任何参数,也会创建一个默认宽高为200*300的矩形。

无论是calc,ajax函数还是Rectangle类,我们都需要在函数体内做默认值的处理,如果语言自身处理岂不乐哉? ES6提供了该特性(Default Parameters),以下是用ES6新特性重写的calc,ajax,Rectangle。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

function calc(x=0, y=0) {

  // ...

  console.log(x, y)

}

calc(); // 0 0

calc(1, 4); // 1 4

  

function ajax(url, async=true, dataType="JSON") {

  // ...

  console.log(url, async, dataType)

}

ajax('../user.action'); // ../user.action true JSON

ajax('../user.action', false); // ../user.action false JSON

ajax('../user.action', false, 'XML'); // ../user.action false XML

  

function Rectangle(width=200, height=300) {

  this.width = width;

  this.height = height;

}

var r1 = new Rectangle(); // 200*300的矩形

var r2 = new Rectangle(100); // 100*300的矩形

var r3 = new Rectangle(100, 500); // 100*500矩形

登录后复制

可以看到,ES6把默认值部分从大括号移到了小括号里,还减少了“||”运算,函数体从此瘦身了。参数默认值嘛,本来就应该在定义参数的地方,这样看起来简洁了不少。O(∩_∩)O

默认参数可以定义在任意位置,比如在中间定义一个

1

2

3

4

function ajax(url, async=true, success) {

  // ...

  console.log(url, async, success)

}

登录后复制

定义了一个默认参数async,url和success是必传的,这时需要把中间的参数置为undefined

1

2

3

ajax('../user.action', undefined, function() {

    

})

登录后复制

注意,不要想当然的把undefined改为null, 即使 null == undefined, 传null后,函数体内的async就是null不是true了。

以下几点需要注意:

1. 定义了默认参数后,函数的length属性会减少,即有几个默认参数不包含在length的计算当中

1

2

3

4

5

6

7

8

9

10

function calc(x=0, y=0) {

  // ...

  console.log(x, y)

}

function ajax(url, async=true, dataType="JSON") {

  // ...

  console.log(url, async, dataType)

}

console.log(calc.length); // 0

console.log(ajax.length); // 1

登录后复制

2. 不能用let和const再次声明默认值,var可以

1

2

3

4

5

function ajax(url="../user.action", async=true, success) {

  var url = ''; // 允许

  let async = 3; // 报错

  const success = function(){}; // 报错

}

登录后复制

另外比较有趣的是:默认参数可以不是一个值类型,它可以是一个函数调用

1

2

3

4

5

6

7

8

9

10

function getCallback() {

  return function() {

    // return code

  }

}

  

function ajax(url, async, success=getCallback()) {

  // ...

  console.log(url, async, success)

}

登录后复制

可以看到这里参数success是一个函数调用,调用ajax时如果没有传第三个参数,则会执行getCallback函数,该函数返回一个新函数赋值给success。这是一个很强大的功能,给程序员以很大的想象发挥空间。

例如,利用这个特性可以强制指定某参数必须传,不传就报错

1

2

3

4

5

6

7

8

function throwIf() {

  throw new Error('少传了参数');

}

  

function ajax(url=throwIf(), async=true, success) {

  return url;

}

ajax(); // Error: 少传了参数

登录后复制

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板