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 相关文章推荐
js 获取计算后的样式写法及注意事项
Feb 25 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
Mar 18 Javascript
jQuery带进度条全屏图片轮播特效代码分享
Jun 28 Javascript
封装获取dom元素的简单实例
Jul 08 Javascript
js 数据存储和DOM编程
Feb 09 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
Jun 21 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
Oct 13 Javascript
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
Jan 30 Javascript
深入理解Angularjs 脏值检测
Oct 12 Javascript
微信小程序wx.request的简单封装
Nov 13 Javascript
使用Node.js实现base64和png文件相互转换的方法
Mar 11 Javascript
jquery实现淡入淡出轮播图效果
Dec 13 jQuery
在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 数据库字段复用的基本原理与示例
2011/07/22 PHP
php利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
php无序树实现方法
2015/07/28 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
php ajax confirm 删除实例详解
2019/03/06 PHP
javascript 写类方式之六
2009/07/05 Javascript
jquery select下拉框操作的一些说明
2010/04/02 Javascript
input按钮的事件处理大全
2010/12/10 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
javascript实现数字倒计时特效
2016/03/30 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
Node.js实现用户评论社区功能(体验前后端开发的乐趣)
2019/05/09 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
2020/01/12 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
[01:04:31]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第二场 1月8日
2021/03/11 DOTA
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
酒店总经理岗位职责
2014/03/17 职场文书
党员公开承诺书2015
2015/01/21 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android