ECMAScript6函数默认参数

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

我们经常会这么写

rush:js;"> 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

rush:js;"> function ajax(url,async,dataType) { async = async !== false dataType = dataType || 'JSON' // ... }

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

再如定义一个矩形类

rush:js;"> 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。

rush:js;"> 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,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(); // 200300的矩形
var r2 = new Rectangle(100); // 100
300的矩形
var r3 = new Rectangle(100,500); // 100*500矩形

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

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

rush:js;"> function ajax(url,success) { // ... console.log(url,success) }

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

rush:js;"> ajax('../user.action',undefined,function() {

})

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

以下几点需要注意:

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

rush:js;"> function calc(x=0,y) } function ajax(url,dataType) } console.log(calc.length); // 0 console.log(ajax.length); // 1

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

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

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

rush:js;"> function getCallback() { return function() { // return code } }

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

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

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

rush:js;"> function throwIf() { throw new Error('少传了参数'); }

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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...