ECMAScript6函数默认参数

作者:hebedich 时间:2024-05-13 09:18:24 

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

我们经常会这么写


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


function ajax(url, async, dataType) {
 async = async !== false
 dataType = dataType || 'JSON'
 // ...
}

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

再如定义一个矩形类


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。


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

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


function ajax(url, async=true, success) {
 // ...
 console.log(url, async, success)
}

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


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

})

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

以下几点需要注意:

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


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可以


function ajax(url="../user.action", async=true, success) {
 var url = ''; // 允许
 let async = 3; // 报错
 const success = function(){}; // 报错
}

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


function getCallback() {
 return function() {
   // return code
 }
}

function ajax(url, async, success=getCallback()) {
 // ...
 console.log(url, async, success)
}

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

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


function throwIf() {
 throw new Error('少传了参数');
}

function ajax(url=throwIf(), async=true, success) {
 return url;
}
ajax(); // Error: 少传了参数

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

标签:ECMAScript6函数,默认参数
0
投稿

猜你喜欢

  • Python中asyncio模块的深入讲解

    2022-05-18 22:33:53
  • Golang分布式应用定时任务示例详解

    2024-02-12 06:23:19
  • Python 中判断列表是否为空的方法

    2023-10-25 13:19:12
  • python实现按首字母分类查找功能

    2023-10-13 11:05:09
  • python合并文本文件示例

    2021-05-08 01:24:49
  • SQL Server把某个字段的数据用一条语句转换成字符串

    2024-01-13 16:10:12
  • 使用PyCharm官方中文语言包汉化PyCharm

    2023-03-20 23:42:38
  • python 用pandas实现数据透视表功能

    2022-04-23 02:49:40
  • 详解BurpSuite安装和配置

    2023-12-30 17:32:12
  • 在vscode中启动conda虚拟环境的思路详解

    2022-01-13 02:43:32
  • JavaScript中随机数方法 Math.random()

    2024-04-10 13:56:30
  • JavaScript图片放大镜效果

    2009-10-19 22:15:00
  • Python属性和内建属性实例解析

    2023-06-10 18:22:15
  • PHP PDOStatement::fetchColumn讲解

    2023-06-06 09:17:20
  • Windows上配置Emacs来开发Python及用Python扩展Emacs

    2022-07-20 01:55:47
  • Python 基于Twisted框架的文件夹网络传输源码

    2021-03-19 03:01:00
  • django中的HTML控件及参数传递方法

    2024-01-01 17:31:33
  • python实现猜数游戏(保存游戏记录)

    2022-08-31 09:39:54
  • Mootools常用方法扩展(三)

    2009-01-14 20:07:00
  • Python实现树的先序、中序、后序排序算法示例

    2022-12-26 04:00:18
  • asp之家 网络编程 m.aspxhome.com