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 getBoundingClientRect() 来获取页面元素的位置
Nov 25 Javascript
jquery选择器之内容过滤选择器详解
Jan 27 Javascript
jquery中one()方法的用法实例
Jan 16 Javascript
jquery性能优化高级技巧
Aug 24 Javascript
javascript针对不确定函数的执行方法
Dec 16 Javascript
探讨JavaScript标签位置的存放与功能有无关系
Jan 15 Javascript
AngularJS延迟加载html template
Jul 27 Javascript
jQuery EasyUI Draggable拖动组件
Mar 01 Javascript
VUE长按事件需求详解
Oct 18 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
Aug 02 Javascript
js实现无缝轮播图插件封装
Jul 31 Javascript
React Native登录之指纹登录篇的示例代码
Nov 03 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/07/10 PHP
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
Symfony控制层深入详解
2016/03/17 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
ECMAScript 基础知识
2007/06/29 Javascript
javascript引用对象的方法代码
2007/08/13 Javascript
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
javascript Window及document对象详细整理
2011/01/12 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
python判断windows隐藏文件的方法
2014/03/21 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
用Python解数独的方法示例
2019/10/24 Python
python批量生成条形码的示例
2020/10/10 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
世界上最好的足球商店:Unisport
2019/03/02 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
银行员工职业规划范文
2014/01/21 职场文书
物流管理专业自荐信
2014/06/23 职场文书
最新离婚协议书范本
2014/08/19 职场文书
学校开学标语
2014/10/06 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
如何写辞职书
2015/02/26 职场文书