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 相关文章推荐
jQuery代码优化 选择符篇
Nov 01 Javascript
js左右弹性滚动对联广告代码分享
Feb 19 Javascript
js调试系列 断点与动态调试[基础篇]
Jun 18 Javascript
浅析javascript函数表达式
Feb 10 Javascript
AngularJS基础 ng-submit 指令简单示例
Aug 03 Javascript
Ajax和Comet技术总结
Feb 19 Javascript
vue实现动态数据绑定
Apr 28 Javascript
jQuery+ajax读取json数据并按照价格排序示例
Mar 28 jQuery
在Create React App中使用CSS Modules的方法示例
Jan 15 Javascript
vue.js实现双击放大预览功能
Jun 23 Javascript
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue打包时去掉所有的console.log
Apr 10 Vue.js
在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中使用XML
2006/10/09 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
php实现cookie加密的方法
2015/03/10 PHP
基于jquery循环map功能的代码
2011/02/26 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
jquery mobile实现拨打电话功能的几种方法
2013/08/05 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
jQuery学习笔记之jQuery中的$
2015/01/19 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
AJAX实现瀑布流触发分页与分页触发瀑布流的方法
2016/05/23 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
jQuery zTree插件使用简单教程
2019/08/16 jQuery
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
python中元类用法实例
2014/10/10 Python
python实现批量改文件名称的方法
2015/05/25 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
使用python实现接口的方法
2017/07/07 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
Python datetime 如何处理时区信息
2020/09/02 Python
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
linux面试题参考答案(6)
2014/08/29 面试题
自考自我鉴定范文
2013/10/30 职场文书
质量工程师岗位职责
2013/11/16 职场文书
园林毕业生自我鉴定范文
2013/12/29 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
小学教师管理制度
2014/01/18 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
入团申请书格式
2019/06/20 职场文书
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android