ES6函数默认参数(Default Parameters)

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

 

我们经常会这么写

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: 少传了参数

  

 

posted on   snandy  阅读(14452)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
历史上的今天:
2014-05-05 仅IE6中链接A的href为javascript协议时不能在当前页面跳转
2011-05-05 跨域请求之JSONP 三
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示