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 相关文章推荐
document.all与WEB标准
May 13 Javascript
js使用for循环与innerHTML获取选中tr下td值
Sep 26 Javascript
通过隐藏iframe实现无刷新上传文件操作
Mar 16 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
Aug 11 Javascript
微信小程序 地图map详解及简单实例
Jan 10 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
Mar 23 jQuery
Vue一次性简洁明了引入所有公共组件的方法
Nov 28 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
Apr 23 Javascript
vue项目打包之开发环境和部署环境的实现
Apr 23 Javascript
Vue双向绑定实现原理与方法详解
May 07 Javascript
Vue看了就会的8个小技巧
Jan 21 Vue.js
vue css 相对路径导入问题级踩坑记录
Jun 05 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
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
Vue.js 图标选择组件实践详解
2018/12/03 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python中for循环详解
2014/01/17 Python
Python解析树及树的遍历
2016/02/03 Python
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
Python get获取页面cookie代码实例
2018/09/12 Python
python训练数据时打乱训练数据与标签的两种方法小结
2018/11/08 Python
python getopt模块使用实例解析
2019/12/18 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
Bally巴利英国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/07 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
理工大学毕业生自荐信范文
2014/02/22 职场文书
挂职个人工作总结
2015/03/05 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
Nginx反向代理配置的全过程记录
2021/06/22 Servers
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL