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 Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
JavaScript 设计模式 富有表现力的Javascript(一)
May 26 Javascript
JavaScript定义类或函数的几种方式小结
Jan 09 Javascript
JS性能优化笔记搜索整理
Aug 21 Javascript
jquery的选择器的使用技巧之如何选择input框
Sep 22 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
Feb 13 Javascript
Javascript类型系统之String字符串类型详解
Jun 21 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
Nov 11 jQuery
vue cli 全面解析
Feb 28 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
May 04 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
Apr 11 Javascript
详解ES6中class的实现原理
Oct 03 Javascript
微信小程序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详细彻底学习Smarty
2008/03/27 PHP
PHP关联链接常用代码
2012/11/05 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
php+mysqli事务控制实现银行转账实例
2015/01/29 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP多进程编程实例详解
2017/07/19 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
js DOM模型操作
2009/12/28 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
详解React 16 中的异常处理
2017/07/28 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
python如何调用百度识图api
2020/09/29 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
使用Python封装excel操作指南
2021/01/29 Python
html5菜单折纸效果
2014/04/22 HTML / CSS
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
精通CAD能手自荐书
2014/01/31 职场文书
离婚协议书范文2015
2015/01/26 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python