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 相关文章推荐
一些相见恨晚的 JavaScript 技巧
Apr 25 Javascript
jQuery 源码分析笔记(6) jQuery.data
Jun 08 Javascript
详解jquery中$.ajax方法提交表单
Nov 03 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
Dec 01 Javascript
jQuery过滤选择器经典应用
Aug 18 Javascript
es6系列教程_ Map详解以及常用api介绍
Sep 25 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
Mar 16 Javascript
JavaScript中click和onclick本质区别与用法分析
Jun 07 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
Apr 24 Javascript
layui type2 通过url给iframe子页面传值的例子
Sep 06 Javascript
简单了解vue中的v-if和v-show的区别
Oct 08 Javascript
原生JS实现九宫格抽奖
Sep 13 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
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
Zend Framework教程之Zend_Registry对象用法分析
2016/03/22 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
jquery()函数的三种语法介绍
2013/10/09 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
React Native中NavigatorIOS组件的简单使用详解
2018/01/27 Javascript
JS中的事件委托实例浅析
2018/03/22 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
Linux下Python获取IP地址的代码
2014/11/30 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
Django框架教程之正则表达式URL误区详解
2018/01/28 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
python计算导数并绘图的实例
2020/02/29 Python
python实现简单井字棋小游戏
2020/03/05 Python
Python实现区域填充的示例代码
2021/02/03 Python
英国网上购买门:Direct Doors
2018/06/07 全球购物
文秘专业应届生求职信范文
2013/11/14 职场文书
电子商务网站的创业计划书
2014/01/05 职场文书
丑小鸭教学反思
2014/02/03 职场文书
运动会入场词60字
2014/02/15 职场文书
《陈涉世家》教学反思
2014/04/12 职场文书
建设工地安全标语
2014/06/07 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
先进典型事迹材料
2014/12/29 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
赢在中国观后感
2015/06/02 职场文书
导游词之大雁塔景区
2019/09/17 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python