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 确定css方框模型(盒模型Box Model)
Jan 22 Javascript
jquery.validate的使用说明介绍
Nov 12 Javascript
javascript 兼容各个浏览器的事件
Feb 04 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
Feb 25 Javascript
利用JQuery写一个简单的异步分页插件
Mar 07 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
js变量提升深入理解
Sep 16 Javascript
原生js实现旋转木马轮播图效果
Feb 27 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
Mar 28 jQuery
基于JavaScript实现无缝滚动效果
Jul 21 Javascript
全站最详细的Vuex教程
Apr 13 Javascript
小程序如何构建骨架屏
May 29 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
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
javascript 获取表单file全路径
2009/12/31 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
js中传递特殊字符(+,&)的方法
2014/01/16 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
JavaScript闭包实例详解
2016/06/03 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
详解JavaScript跨域总结与解决办法
2016/10/31 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
[02:23]1个至宝=115个英雄特效 最“绿”至宝拉比克“魔导师密钥”登场
2018/12/29 DOTA
django之常用命令详解
2016/06/30 Python
Python数据结构之单链表详解
2017/09/12 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
什么是继承
2013/12/07 面试题
大专应届生个人简历的自我评价
2013/10/15 职场文书
小学生操行评语
2014/04/22 职场文书
捐书活动总结
2014/05/04 职场文书
伊琍体标语
2014/06/25 职场文书
教师师德表现自我评价
2015/03/05 职场文书
酒店前台岗位职责
2015/04/16 职场文书
结婚纪念日感言
2015/08/01 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android