ES6基础之默认参数值


Posted in Javascript onFebruary 21, 2019

如果调用函数的过程中,定义的参数缺失,此参数变量的值则会是undefined。怎么给缺失的参数赋值默认值,在ES6之前,没有简洁的语法设置缺失参数的默认值,但是我们一般可以这么编写代码解决缺失参数默认值:

function myFunction(x, y, z) {
 x = x === undefined ? 1 : x;
 y = y === undefined ? 2 : y;
 z = z === undefined ? 3 : z;
 console.log(x, y, z); //Output "6 7 3"
 }
 myFunction(6, 7);

这种写法是不是比较麻烦?默认值的设置是不是不够直观?在ES6中,我们可以用更简洁的语法进行实现,通过本篇文章你将学习到以下内容:

  • 使用ES6语法声明参数默认
  • 值使用undefined传
  • 参参数运算

使用ES6语法声明参数默认值

我们可以使用ES6简洁的语法,如下示例进行声明函数参数的默认值:

function myFunction(x = 1, y = 2, z = 3) {
 console.log(x, y, z); 
}
myFunction(6,7); // Outputs 6 7 3

在上述代码示例中,我们在调用此函数中传递了前两个参数,因此参数的默认值(即x=1和y=2)将会被覆盖(即x=6和y=7)。由于第三个参数缺省,因此z使用默认值,将会是3。

使用undefined传参

如果我们想让具体某个参数使用默认值,我们可以使用undefined进行赋值,如下段代码所示:

function myFunction(x = 1, y = 2, z = 3) {
 console.log(x, y, z); // Outputs "1 7 9"
 }
 myFunction(undefined,7,9);

是不是很简单,只需要使用undefined,我们就可以指定具体某个参数使用默认值。

参数运算

在ES6中我们不仅可以给参数默认赋值具体的数值,同时参数赋值支持参数的逻辑运算进行赋值,如下段代码所示:

function myFunction(x = 1, y = 2, z = x + y) {
 console.log(x, y, z); // Output "6 7 13"
 }
 myFunction(6,7);

在上述代码中,我们只传入了前两个参数,第三个参数缺省,第三个参数的值默认值是则会是前两个参数之和。

小节

今天的内容就到这里,当我们在开发一些工程应用通用组件时,都需要暴露一些接口以供使用。而这些接口的友好性是决定这个组件质量的一大指标,其中参数缺省值(默认值)的完善程度同时也影响接口的友好性,感谢ES6能让我们用如此简介的语法设置参数的缺省值。

与解构赋值默认值结合使用

这里有两种写法需要区分一下:

function m1({x=0,y=0} = {}){
  return [x,y];
}
function m2({x,y} = {x:0,y:0}){
  return [x,y];
}
m1({x:3});//[3,0]
m2({x:3});//[3,undefined]
m1({});//[0,0]
m2({});//[undefined,undefined]

参数默认值的位置

通常情况下,定义了默认值的参数应该是函数的尾参数。因为这样比较容易看出,到底省略了哪些参数,如果非尾部的参数设置默认值,实际上这个参数是无法省略的。

如果有默认值的参数都不是尾参数,这时,无法只省略该参数而不省略其后的参数,除非显示输入undefined。如果传入undefined,那么就会触发默认值,但是null没有这个效果。

函数的length属性

如果函数指定了默认值后,函数的length属性就不会包含有默认值的参数。这是因为length属性的含义是,该函数预期传入的参数个数,某个参数指定默认值之后,预期传入的参数个数就不包括这个参数了,同理,rest参数也不会计入length属性。

函数参数默认值的类型

(1)变量
如果函数参数的默认值是一个变量,则该变量所处的作用域和其他变量的作用域规则相同,即是先前函数的作用域,然后再是全局作用域。

(2)函数
如果函数A的参数默认值是函数B,那么由于函数的作用域是其声明的时候所在的作用域,函数B的作用域就在全局作用域而不是函数A的作用域。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 将disabled的元素置为enabled的三种方法
Jul 25 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
Jul 10 Javascript
使用js实现关闭js弹出层的窗口
Feb 10 Javascript
深入php面向对象、模式与实践
Feb 16 Javascript
Bootstrap 轮播(Carousel)插件
Dec 26 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
vue组件父与子通信详解(一)
Nov 07 Javascript
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
Jul 02 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
Jul 22 Javascript
vue组件命名和props命名代码详解
Sep 01 Javascript
vue使用过滤器格式化日期
Jan 20 Vue.js
微信小程序HTTP接口请求封装的实现
Feb 21 #Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
Feb 21 #Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 #Javascript
详解Puppeteer前端自动化测试实践
Feb 21 #Javascript
javascript中join方法实例讲解
Feb 21 #Javascript
React 组件渲染和更新的实现代码示例
Feb 21 #Javascript
vue图片上传本地预览组件使用详解
Feb 20 #Javascript
You might like
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
2014/06/19 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
js中onload与onunload的使用示例
2013/08/25 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之主动触发事件和模拟冒泡处理
2015/11/24 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
webpack4.0 入门实践教程
2018/10/08 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
CLR与IL分别是什么含义
2016/08/23 面试题
秋季运动会活动方案
2014/02/05 职场文书
一份创业计划书范文
2014/02/08 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
售后服务承诺书
2014/03/26 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
重阳节座谈会主持词
2015/07/03 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
导游词之峨眉山
2019/12/16 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android