ES6 函数的扩展
ES6 函数的扩展
- 1. 函数参数的默认值
- 1.1 基本用法
- 1.2 与解构赋值默认值结合使用
- 1.3 参数默认值的位置
- 1.4 函数的length属性
- 2. rest参数
- 2.1 rest参数
- 2.2 arguments对象
- 3. 函数的name属性
- 4. 箭头函数
1. 函数参数的默认值
1.1 基本用法
ES6之前,不能直接为函数的参数指定默认值,通常需要先判断一下参数是否被赋值,如果没有,则为其设置默认值。
if (typeof 参数 === 'undefined') {// 为参数设置默认值语句
}
ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。
function func(param1 = 'defaultValue1', param2 = 默认值) {......
}
注:只有当参数值严格等于undefined
时,其默认值才会生效。
1.2 与解构赋值默认值结合使用
函数的参数如果是一个对象,在进行解构赋值时,参数中的变量与实参对象的属性名进行匹配,如果两者相同,则进行正常赋值操作,如果参数中的变量未匹配到同名的实参对象属性,则其值为undefined
。
function foo({x, y = 5}) {console.log(x, y);
}foo({}) // undefined 5
foo() // 报错
上面代码中只使用了对象的解构赋值默认值,没有使用函数参数默认值,如果在调用函数时没有提供默认值,则会报错。
function foo({x, y = 5} = {}) {console.log(x, y);
}foo() // undefined 5
上面代码中,如果在调用函数时没有提供参数,函数foo
的参数默认为一个空对象。
1.3 参数默认值的位置
通常情况下,定义了默认值的参数,应该是函数的尾参数。如果非尾部的参数设置了默认值,实际上这个参数是没法省略的。如果非要使用非尾部参数的默认值,则需要显示传入undefined
来触发默认值。
1.4 函数的length属性
函数指定了默认值以后,函数的length
属性,将返回没有指定默认值的参数个数。准确地说,函数的length
属性会依次计算没有指定默认值的参数个数,遇到第一个指定了默认值的参数时就停止计数,然后返回这个数值。
(function (a = 0, b, c) {}).length // 0
(function (a, b = 1, c) {}).length // 1
2. rest参数
2.1 rest参数
ES6引入了 rest参数 (形式为 ...变量名
),用于获取函数的多余参数。这样就不需要使用arguments
对象了。
rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中,即 ...数组名
,表示获取该数组中的全部元素。这种用法可以将多个数组的元素拼接到一个数组中。
数组a = [1,2,3] , 数组b = [4,5,6]
数组c = [...a,...b], 则数组c = [1,2,3,4,5,6]
注意点:
- rest参数只能是最后一个参数,如果后面再加其它参数,则会报错。
- 函数的
length
属性,不包括rest参数。
2.2 arguments对象
arguments
对象不是数组,而是一个类似数组的对象,里面存放函数的实参。
将arguments
对象转换成数组的方法:Array.from(arguments)
或者Array.prototype.slice.call(arguments)
。
3. 函数的name属性
函数的name
属性,返回该函数的函数名。
对于一个匿名函数赋值给一个变量,ES 5和 ES6 在这个属性上有不同的返回值,ES5的name
属性会返回空字符串,ES6的name
属性会返回实际的函数名。
如果将一个具名函数赋值给一个变量,则 ES5 和 ES6 的name
属性都返回这个具名函数原本的名字。
4. 箭头函数
ES6 允许使用“箭头”(=>
)定义函数。
var f = function(params) {// 函数体
}
// 等同于
var f = (params) => {// 函数体
}
如果箭头函数不需要参数或者需要多个参数,则使用一个圆括号代表参数部分。
如果箭头函数的代码块部分多于一条语句,就要使用花括号把他们括起来,并且使用return
语句返回。
var f = () => { ... };
var f = (p1, p2) => { ... };
由于大括号被解释为代码块,如果箭头函数直接返回一个对象,必须在对象的外面加上圆括号,否则会报错。
// 报错
let getTempItem = id => { id: id, name: "Temp" };// 不报错
let getTempItem = id => ({ id: id, name: "Temp" });
如果箭头函数只有一行语句,且不需要返回值,可以采用下面的写法,就不用写大括号了。
let fn = () => void doesNotReturn();
箭头函数可以与变量解构结合使用。
const full = ({ first, last }) => first + ' ' + last;// 等同于
function full(person) {return person.first + ' ' + person.last;
}
箭头函数可以和rest参数结合使用。
const numbers = (...nums) => nums;numbers(1, 2, 3, 4, 5)
// [1,2,3,4,5]
注意点:
- 箭头函数没有自己的
this
对象。箭头函数的this
指向定义时所在的作用域,普通函数的this
指向运行时所在的作用域(即全局对象window
)。 - 不可以当作构造函数,也就是说,不可以对箭头函数使用
new
命令,否则会抛出一个错误。 - 不可以使用
arguments
对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。 - 不可以使用
yield
命令,因此箭头函数不能用作 Generator 函数。
参考文档:ECMAScript 6入门-函数的扩展
相关文章:

Mycat分片规则详解
1、分片枚举 通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下: <ta…

COGS 2769. mk去撸串
【题目描述】 今天 mk 去撸串 ,恰逢店里活动 ,如果吃一种串串超过记录, 可以 赠送 328, 所以 mk 想知道他吃的串串中吃的最多的种类是什么. 【输入格式】 第一行一个整数 1<n<50000; 然后有 n 行长度<100 的全部由小写字母组成的字符串;每个代表一种串串 【输出格式】…

C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
由于种种原因,我们有时需要从互联网上抓取一些资料,有些页面可以直接打开,而有些页面必登录之后才能打开。本文介绍的是使用 HttpWebRequest 和 HttpWebResponse 自动填写提交 ASP.NET 表单并保持 Session 和 Cookie 的一个完整的例子。这里涉…

rman备份后为什么要同时备份归档日志
今天在CU上看到有人问一个问题:rman备份后为什么要同时备份归档日志呢,既然rman是物理备份,所有数据已经都备份,再次备份归档日志何用?思考了一下,认为有必要记录一下为什么要备份归档日志:其实…

Angular响应式表单及表单验证
1. 什么是响应式表单? 响应式表单提供了一种模型驱动的方式来处理表单输入,其中的值会随时间而变化。 响应式表单使用显示的,不可变的方式,管理表单在特定时间点上的状态。对表单状态的每一次变更都会返回一个新的状态ÿ…

void *指针的加减运算
1、手工写了一个程序验证void *指针加减运算移动几个字节: //本程序验证空类型指针减1移动几个字节 #include <stdio.h> int main(int argc, char *argv[]) {int a10,b20;int *pa&a;void …

ASP.NET运行原理
一个ASP.NET的应用程序是开始于IIS的. 当你请求一个包含ASP.NET应用的网址时,IIS接受到请求(IIS是WEB服务守候进程),IIS收到请求后,会根据请求者请求的主机头或者IP或者端口号来找到对应的站点. 当找到站点后,如果你请求的资源是以ASPX为结尾的WEBFORM,时,IIS会将控制权交给一…

vue 树形下拉框 亲测 好用
https://vue-treeselect.js.org/ 顺带说一个开发中使用这个组件遇到的问题,关于回显之后无法修改的问题 找了很长时间 原因是数据类型导致的问题,数组里面应该是数字类型,直接转数组的话里面的值都是字符串,所有得额外做处理了转…

通过xmanager远程连接redhat linux as 5
通过xmanager远程连接redhat linux as 5 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />rhel5与rhel4不同的地方是,rhel5里没有/etc/X11/gdm/这个目录,rhel5的gdm的配置文件放在这里/usr/share/gdm/defa…

bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我们必须优化。 题目说了一个数会出现5次,那么我们可以预处理得到 第一个序列a[]每…

C语言第二次博客作业---分支结构
C语言第二次博客作业---分支结构 一,PTA实验作业 题目1.计算分段函数 本题目要求计算下列分段函数f(x)的值 1.代码 double x, result;scanf("%lf", &x);if (x >0)result sqrt(x);elseresult pow( x 1, 2) 2 * x 1 / x;printf ("f(%.2f) …

Lazy.NET
.NET 4.0里,在System名称空间中多了一个名为Lazy<T>新泛型类,该类的作用正如其名称所示。下面给出了一个使用的例子:1 var lazy newLazy<IList<OrderRow>>(2 () >3 {4 var rows //get order rows;5 returnrows;6 });7 8…

Angular 组件交互
Angular 组件交互 组件交互: 组件通讯,让两个或多个组件之间共享信息。 使用场景: 当某个功能在多个组件中被使用到时,可以将该特定的功能封装在一个子组件中,在子组件中处理特定的任务或工作流。 交互方式࿱…

java-在应用中获取spring定义的bean
因为写了些bean作为quartz的任务用spring配置了,但有些时候需要在别的类中使用这些bean,没有太仔细去研究spring,依稀记得有个getBean,到网上g了一把,发现方法不止一种,选了一种最简单的方法: 主…

Enterprise Architect 7 入门教程 1
一. 简介生命周期软件设计方案——Enterprise Architect是以目标为导向的软件系统。它覆盖了系统开发的整个周期,除了开发类模型之外,还包括事务进程分析,使用案例需求,动态模型,组件和布局,系…

FCS省选模拟赛 Day5
传送门 Solution Code #include<bits/stdc.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) inline int read() {int x0,f1;char chgetchar();while(ch<0||ch>9){if(ch-)f-1;chgetchar();}while(ch>…

python中的单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的…

JavaScript 数据类型转换
1. typeof 操作符 使用typeof操作符来检测变量的数据类型。 使用方式:typeof 变量名 或者 typeof(变量名) 返回结果: number、string、boolean、object、undefined、function typeof {} // 返回object typeof [] // 返回object typeof null // 返回o…

Cisco asa 5510升级IOS和ASDM
Cisco asa <?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" />5510升级IOS和ASDMshow version 查看当前运行的系统信息,包括启动文件(即IOS)等 show boot 查看当…

Angular 服务
服务的概念 服务是在多个“互相不知道”的类之间共享信息的好办法。—— 官方文档 可以理解为组件中需要的数据源是由服务提供的,也可以理解为组件类中的方法通过调用服务中的方法向服务器请求数据。 Injectable() 服务 服务类需要导入Injectable符号并需要加上Inj…

[Linux] 029 脚本安装包
1. 脚本安装包 脚本安装包并不是独立的软件包类型,常见安装的是源码包是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装非常类似于 Windows 下软件的安装方式2. Webmin 的作用 Webmin 是一个基于…

基于Android平台扫码识别并链接服务器demo
资料在我的网盘:Android文件夹 第一:开发平台搭建。 本项目采用Android studio(android-studio-bundle-162.4069837-windows.exe)作为开发平台,安装JDK(jdk-8u144-windows-x64.exe)。 下载对…

WCF学习笔记(二):在WCF中使用集合传输数据
最近的开发,一直被DataContract头疼,微软为了更好的通用性和代码无关性,将DataContract进行了一系列的优化,使作为DataContract的类在进行Serialize的时候会被序列化成非常通用的数据格式,可以在任何开发语言中调用。但…

如何面对“大概什么时候能完成?”
你在听着经理、上级或是公司内部的某类用户滔滔不绝的给你讲需求,这里面常常能听到“最好能加上……”,“我希望……”,你一边听着,一边心里盘算着这些需求背后需要怎样的技术支撑,要采纳的方案,然后你看到…

Angular Http
Http服务 HttpClient 是 Angular 通过 HTTP 与远程服务器通讯的机制。 启用Http服务的准备工作 要让 HttpClient 在应用中随处可用,需要在根模块的NgModule.imports 数组中加入 HttpClientModule。 Http方法返回单个值 HTTP 是一个请求/响应式协议。你发起请求&am…

2019第四周作业(基础作业+挑战作业)
基础题1: 输入一个正整数 n (1≤n≤10)和n 阶方阵a的元素,如果方阵a中的所有元素都沿主对角线对称,输出“Yes”, 否则,输出“No”。主对角线为从矩阵的左上角至右下角的连线,方阵a中的所有元素都沿主对角线对称指对所有…

Taglib原理和实现:再论El和JST
作者: WalkingWithJava 出处: Java研究组织 问题:你想和JSTL共同工作。比如,在用自己的标签处理一些逻辑之后,让JSTL处理余下的工作。 看这个JSP例子: <% String name"diego"; reque…

UWP Windows10开发获取设备位置(经纬度)
UWP Windows10开发获取设备位置(经纬度) 原文:UWP Windows10开发获取设备位置(经纬度)1.首先要在UWP项目的Package.appxmanifest文件中配置位置权限,如下图所示: 2.Package.appxmanifest后选择第三个选项卡…

[零基础学JAVA]Java SE实战开发-37.MIS信息管理系统实战开发[JDBC](1)
MIS信息管理系统实战开发之使用MySQL实现保存开发背景ID、姓名、年龄为公共信息,而学生有成绩,工人有工资定义一个抽象类Person(ID、姓名、年龄),学生是其子类,有成绩,工人是其子类有工资ID如何…

【数论总结】-----励志写好一篇数论总结↖(^ω^)↗//正在施工...未完工
近期学了学数论,来写一波总结吧。 (1)排列组合,比较基础的东西了吧。//只写个概念吧,(逃: 概念:就是从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一…