ECMAScript6函数默认参数


Posted in Javascript onJune 12, 2015

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

我们经常会这么写

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

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

Javascript 相关文章推荐
兼容多浏览器的字幕特效Marquee的通用js类
Jul 20 Javascript
jQuery中odd选择器的定义和用法
Dec 23 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
谈谈javascript中使用连等赋值操作带来的问题
Nov 26 Javascript
js+css实现回到顶部按钮(back to top)
Mar 02 Javascript
详解jQuery中的empty、remove和detach
Apr 11 Javascript
vue中倒计时组件的实例代码
Jul 06 Javascript
详解React服务端渲染从入门到精通
Mar 28 Javascript
vue 表单之通过v-model绑定单选按钮radio
May 13 Javascript
vue实现整屏滚动切换
Jun 29 Javascript
JavaScript canvas实现文字时钟
Jan 10 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
Feb 07 Javascript
在JavaScript中操作时间之setYear()方法的使用
Jun 12 #Javascript
简介JavaScript中setUTCSeconds()方法的使用
Jun 12 #Javascript
JS中产生标识符方式的演变
Jun 12 #Javascript
JS中处理时间之setUTCMinutes()方法的使用
Jun 12 #Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
Jun 12 #Javascript
JavaScript中setUTCFullYear()方法的使用简介
Jun 12 #Javascript
禁止按回车键提交表单的方法
Jun 11 #Javascript
You might like
PHP 模拟登陆MSN并获得用户信息
2009/05/16 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
PHP中substr()与explode()函数用法分析
2014/11/24 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)
2013/04/02 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
微信小程序 页面跳转及数据传递详解
2017/03/14 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
python格式化字符串实例总结
2014/09/28 Python
在Python中使用next()方法操作文件的教程
2015/05/24 Python
解决PyCharm中光标变粗的问题
2017/08/05 Python
python扫描proxy并获取可用代理ip的实例
2017/08/07 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
Order by的几种用法
2013/06/16 面试题
经济学博士求职自荐信范文
2013/11/23 职场文书
环保建议书600字
2014/05/14 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
教师辞职信范文
2015/02/28 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书
Java版 单机五子棋
2022/05/04 Java/Android