[ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)
[原创] 码路工人
大家好,这里是码路工人有力量,我是码路工人,你们是力量。
今天总结一下 ES6 中跟参数相关的内容。
欢迎补充斧正、留言交流。
让我们互相学习一起进步。
1. ES6 参数默认值(非必需参数/可选参数)
在 ES6 之前,函数的参数是无法设默认值的,聪明的人们当然有变通的方式,通过判断来参在函数刚开始给它赋上预想的初始值。具体在这篇里有介绍。
扩展阅读: [ES5 中参数默认值的手动实现][ES5Parameter]
到了 ES6,就可以愉快地设定参数默认值了。在下面的
defaultParamInEnd函数中,用age = 18来设了默认值。/* eg.0
* set default value for parameters
*/
//------------------------------------------------- const defaultParamInEnd = function(name, age = 18) {
console.log(`name: ${name} -- age: ${age}`)
} defaultParamInEnd("Coder Power")
// name: Coder Power -- age: 18 defaultParamInEnd("Coder Power", 32)
// name: Coder Power -- age: 32 //-------------------------------------------------
上面的例子中,设默认值放在了末尾,也是我们 CSharper 惯用的方式,当多个参数有默认值时也是连续地放在尾部。
C#中不允许设默认值的参数出现在中间或者不连续,所有可选参数必须放在必需参数的后面。那
js中可不可以,带默认值的参数(也就是非必须参数),不在最后的位置呢?下面例子中我们来试一下。
```javascript
/* eg.1
* default value of parameters
*/
//-------------------------------------------------
const defaultParamInCenter = function(name, age = 18, gender) {
console.log(` name: ${name} -- age: ${age} -- gender: ${gender}`)
}
defaultParamInCenter("Coder Power", undefined, "male")
// name: Coder Power -- age: 18 -- gender: male
defaultParamInCenter("Coder Power", null, "male")
// name: Coder Power -- age: null -- gender: male
//-------------------------------------------------
```
结果显示,非必需参数可以出现在中间位置(后面再跟有必需参数)。
注意在传值上还有以下区别:
- 当我们给带默认值的形参`age`传一个`undefined`的时候,函数里得到了默认值`18`;
- 而当我们传`null`的时候,函数里就没有得到默认值,而是`null`了。
建议在定义函数时还是将非必需参数写在最后,设默认值本身就是为了调用时方便,这样就不必为了凑数去传一个`undefined`,直接不传才是非必须参数设计的初衷。
2. 剩余操作符语法获取剩余参数(Rest operator syntax)
...(
...既是剩余操作符语法又是展开操作符语法Spread operator syntax,这个另做介绍)/* eg.2
* rest parameters
*/
//------------------------------------------------- function restParams(name, ...other) {
console.log(`name: ${name}`)
console.log(`other: ${other}`)
} restParams("Coder Power", 18, "male")
// name: Coder Power
// other: 18,male //-------------------------------------------------
从上面的打印信息中
other: 18,male能够看出,other里放了两个值,也就是剩下的两个参数的值都被它自己接收了。而如果没有剩余参数操作符语法,它肯定还是只能接收一个值(也就是第二个参数的值)。这里码路工人认为可以这么理解:
...首先会把它后面传来的参数收集起来,相当于放进[ ]数组,再充当展开操作符语法,相当于做了个拷贝塞到形参other里。
或者直接理解为把传过来的剩余参数用展开操作符语法塞到形参other里。- 脑洞一下:展开操作符语法可以不用在参数末尾吗?
/* eg.3
* rest parameter operator not in end
*/
//------------------------------------------------- function restParamsNotInEnd(...someParams, gender) {
console.log(`other: ${other}`)
console.log(`someParams: ${someParams}`)
} restParamsNotInEnd("Coder Power", 18, "male")
// SyntaxError: Rest parameter must be last formal parameter //-------------------------------------------------
结果报错了,异常信息显示
剩余参数必须置于最后位置。
- 脑洞一下:展开操作符语法可以不用在参数末尾吗?
3. 参数的解构赋值(Destructuring Assignment)
如果一个方法处理内容简单仅仅用到了一个对象的个别属性,而接收的参数是一个完整的对象时,可以只解构获取想要的内容(也可以是全部属性)。
/* eg.4
* Destructuring Assignment of parameters
*/
//------------------------------------------------- const person = {
name: "Coder Power",
age: 18,
gender: "male",
mail: "test@abc.com",
sister: [
{
name: 'Emily',
age: 22,
gender: "female"
},
{
name: 'Lucy',
age: 15,
gender: "female"
}
],
address: "avenue city province country"
} function sayHello ({ name, age, birthday = 20101219 }) {
console.log(`Hello! I'am ${ name }, ${ age } years old.`)
} sayHello(person)
// Hello! I'am Coder Power, 18 years old. //-------------------------------------------------
实际上
{ }解构不仅仅可以用在参数上,写在函数内也是一样的效果。
这同样还体现在后面要讲到的模块化导入 import的使用上。
注意:参数里的解构赋值不支持取别名,其它解构支持别名
但是可以赋默认值
/* eg.4
* default value for Destructuring Assignment of parameters
*/
//------------------------------------------------- function sayHelloAgain ({ name, age, birthday = 19860101 }) {
console.log(`Hello! I'am ${ name }, ${ age } years old.`)
console.log(`Birthday: ${ birthday}`)
} sayHelloAgain(person)
// Hello! I'am Coder Power, 18 years old.
// Birthday: 19860101 //-------------------------------------------------
上面的示例中打印出了
birthday的默认值。
关于 ES6 中参数相关的内容就介绍到这里,其中用到的还没有讲到的特性,会在后续的文章中一一介绍。
欢迎谬误斧正和转发分享。还可以评论区留个言再走啊~
希望对你能有帮助,下篇再见。
[ES6系列-03]ES6中关于参数相关特性详解(参数默认值与参数解构赋值与剩余参数)的更多相关文章
- ES6系列之项目中常用的新特性
ES6系列之项目中常用的新特性 ES6常用特性 平时项目开发中灵活运用ES6+语法可以让开发者减少很多开发时间,提高工作效率.ES6版本提供了很多新的特性,接下来我列举项目中常用的ES6+的特性: l ...
- LINQ系列:C#中与LINQ相关特性
1. 匿名类型 通过关键字var定义匿名类型,编译器将根据运算符右侧表达式的值来发出一个强类型. 使用匿名类型时要遵守的一些基本规则: ◊ 匿名类型必须有一个初始化值,而且这个值不能是空值(null) ...
- 单元测试系列之十一:Jmockit之mock特性详解
本文是Jmockit学习过程中,根据官网所列的工具特性进行解读. 1.调用次数约束(Invocation count constraints) 可以通过调用计数约束来指定预期和/或允许匹配给定期望的调 ...
- 研究下JavaScript中的Rest參数和參数默认值
研究下JavaScript中的Rest參数和參数默认值 本文将讨论使 JavaScript 函数更有表现力的两个特性:Rest 參数和參数默认值. Rest 參数 通常,我们须要创建一个可变參数的函数 ...
- PHP 判断是表单否有这个参数,如果没有则设置默认值
<?php @$name = $_GET["name"]; if(isset($name)) { echo "name = " .$name; } els ...
- 获取列表数据时,getList 设置默认参数:getList(page = 1),点击分页及前往时,传page参数,其他使用page的默认值:1
获取列表数据时,getList 设置默认参数:getList(page = 1),点击分页及前往时,传page参数,其他使用page的默认值:1
- PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解
本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找. 声明: 1.如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记: 2.本文为老猿Python学习 ...
- Flink-1.10中的StreamingFileSink相关特性
一切新知识的学习,都离不开官网得相关阅读,那么StreamingFileSink的官网介绍呢? https://ci.apache.org/projects/flink/flink-docs-rele ...
- flutter系列之:flutter中常用的GridView layout详解
目录 简介 GridView详解 GridView的构造函数 GridView的使用 总结 简介 GridView是一个网格化的布局,如果在填充的过程中子组件超出了展示的范围的时候,那么GridVie ...
随机推荐
- UVA-2【NOI2014】起床困难综合症
#2. [NOI2014]起床困难综合症 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过 ...
- P6474 [NOI Online #2 入门组] 荆轲刺秦王
P6474 [NOI Online #2 入门组] 荆轲刺秦王 bfs+差分+卡常 本来我其实是场内选手,但是因为记错提交时间,晚了半小时才交,交不上了,就自动降级为了场外选手 题面复杂,不简述了 首 ...
- pycharm(破解教程)
1.下载破解补丁 下载补丁文件 jetbrains-agent.jar 2.双击 pycharm-professional-2019.3.exe 安装 pycharm 如果你是刚下载的pycharm ...
- 数据可视化:使用python代码实现可视数据随机漫步图
#2020/4/5 ,是开博的第一天,希望和大家相互交流学习,很开森,哈哈~ #像个傻子哟~ #好,我们进入正题, #实现功能:利用python实现数据随机漫步,漫步点数据可视化 #什么是 ...
- 软件——Ubuntu16.04设置静态ip地址
1.获取网卡名称 在命令行输入ifconfig -a 2.修改网卡配置文件 sudo vim /etc/network/interfaces 加上下面的配置,IP地址可以成适合你的 auto eth0 ...
- Java——Spring常用jar包功能详解
很多小伙伴包括我自己,在使用spring的时候导入了一堆jar包,但是并不明白每个jar的用途,使用spring的不同功能时也不知该导入哪个jar包,今天记录一下spring各个jar包的含义,供大家 ...
- Hadoop入门学习笔记-第二天 (HDFS:NodeName高可用集群配置)
说明:hdfs:nn单点故障,压力过大,内存受限,扩展受阻.hdfs ha :主备切换方式解决单点故障hdfs Federation联邦:解决鸭梨过大.支持水平扩展,每个nn分管一部分目录,所有nn共 ...
- 支付宝小程序云开发serverless----获取用户的user_id
支付宝小程序云开发serverless----获取用户的user_id 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 开通云调 ...
- 使用EF Code First生成模型,如何让时间字段由数据库自动生成
场景:保存记录时需要时间字段,该时间如果由前台通过DateTime.Now产生,存在风险,比如修改客户端的系统时间,就会伪造该记录的生成时间.因此,需要在保存记录时,由后台自动赋予具体的时间. 实现方 ...
- HttpRequestUtils post get请求
package com.nextjoy.projects.usercenter.util.http; /** * Created by Administrator on 2016/10/20. */ ...