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 相关文章推荐
文字幻灯片
Jun 26 Javascript
javascript 特殊字符串
Feb 25 Javascript
js/jquery解析json和数组格式的方法详解
Jan 09 Javascript
使用js复制链接中的部分文字的方法
Jul 30 Javascript
jQuery简单操作cookie的插件实例
Jan 13 Javascript
BootStrap3学习笔记(一)之网格系统
May 20 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
Dec 02 Javascript
BootStrap Fileinput上传插件使用实例代码
Jul 28 Javascript
JavaScript学习笔记之函数记忆
Sep 06 Javascript
详解如何使用webpack打包JS
Jun 21 Javascript
如何在JavaScript中创建具有多个空格的字符串?
Feb 23 Javascript
基于JavaScript实现轮播图效果
Jan 02 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获得当前的脚本网址
2007/12/10 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
php mail to 配置详解
2014/01/16 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
jquery trim() 功能源代码
2011/02/14 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
ES6生成器用法实例分析
2017/04/10 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
2021/03/01 jQuery
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
Python连接PostgreSQL数据库的方法
2016/11/28 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
python使用Matplotlib画饼图
2018/09/25 Python
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
python redis存入字典序列化存储教程
2020/07/16 Python
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
社区学雷锋活动策划方案
2014/01/30 职场文书
担保书怎么写
2014/04/01 职场文书
节能减排倡议书
2014/04/15 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书