[js高手之路] es6系列教程 - 不定参数与展开运算符(...)
三个点(...)在es6中,有两个含义:
- 用在形参中, 表示传递给他的参数集合, 类似于arguments, 叫不定参数. 语法格式: 在形参面前加三个点( ... )
- 用在数组前面,可以把数组的值全部打散,展开,叫展开运算符. 语法格式: 在数组面前加三个点( ... )
求不定参数的和,以前可以用arguments来做,现在可以用不定参数来做,如下:
function add( ...values ){
console.log( values ); // [10, 20, 30]
let sum = 0;
for( let i = 0, len = values.length; i < len; i++ ){
sum += values[i];
}
return sum;
}
var res = add( 10, 20, 30 );
console.log( res ); //
function add( ...keys, last ) { //报错,不定参数只能放在最后面
}
// function add( ...key1, ...key2 ){ //报错,一个函数不能出现多个不定参数
// }
筛选拷贝对象的属性,之前我们是这样子做的:
function pick( src ){
let target = Object.create( null );//创建一个空对象,跟new Object不同
for( let i = 1, len = arguments.length; i < len; i++ ){
target[arguments[i]] = src[arguments[i]];
}
return target;
}
let user = {
name : 'ghostwu',
age : 22,
sex : 'man',
};
var obj = pick( user, 'name', 'age' ); //拷贝user对象的name和age属性
console.log( obj ); //{name: "ghostwu", age: 22}
这样做没有什么问题,读取属性我们始终要记得从1开始, 因为arguments对象的索引0 被 src这个参数占据了. 用不定参数修改如下:
function pick( src, ...keys ){
console.log( keys ); //['name','age'];
let target = Object.create( null );
for( let i = 0, len = keys.length; i < len; i++ ){
target[keys[i]] = src[keys[i]];
}
return target;
}
let user = {
name : 'ghostwu',
age : 22,
sex : 'man',
};
var obj = pick( user, 'name', 'age' );
console.log( obj );
以上方式,更符合数组操作习惯, 拿来就用,不要老是记着从1开始
不定参数与arguments类似,当初设计的目的就是为了取代arguments,那不定参数会不会影响arguments呢?
function show( ...keys ){
console.log( keys.length ); //
console.log( arguments.length ); //
keys[0] = 1000;
console.log( keys[0], keys[1], keys[2] ); // 1000,20,30
console.log( arguments[0], arguments[1], arguments[2] ); //10,20,30
}
show( 10, 20, 30 );
不定参数修改之后,arguments并不会受到影响
展开运算符:
let a = 10, b = 20;
console.log( Math.max( a, b ) ); //
let arr = [ 1, 3, 0, -1, 20, 100 ];
console.log( Math.max( arr ) );//NaN, max不能接收数组参数
我们可以借助apply的语法,把数组传递进去
let arr = [ 1, 3, 0, -1, 20, 100 ];
console.log( Math.max.apply( Math, arr ) );//
有了展开运算符之后,更简单
let arr = [ 1, 3, 0, -1, 20, 100 ];
console.log( Math.max( ...arr ) ); //100 ...: 把数组展开
console.log( Math.max( ...arr, 1000 ) ); //
[js高手之路] es6系列教程 - 不定参数与展开运算符(...)的更多相关文章
- javascript es6系列教程 - 不定参数与展开运算符(...)
三个点(...)在es6中,有两个含义: 用在形参中, 表示传递给他的参数集合, 类似于arguments, 叫不定参数. 语法格式: 在形参面前加三个点( ... ) 用在数组前面,可以把数组的值 ...
- [js高手之路] es6系列教程 - 对象功能扩展详解
第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...
- [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解
接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...
- [js高手之路] es6系列教程 - 迭代器与生成器详解
什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...
- [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...
- [js高手之路]es6系列教程 - 解构详解
解构通俗点说,就是通过一种特定格式,快捷的读取对象/数组中的数据的方法, es6之前,我们通过对象名称[键] 读取数据 var User = { 'name' : 'ghostwu', 'age' : ...
- [js高手之路] es6系列教程 - 函数的默认参数详解
在ES6之前,我们一般用短路表达式处理默认参数 function show( a, b ){ var a = a || 10; var b = b || 20; console.log( a, b ) ...
- [js高手之路] es6系列教程 - 箭头函数详解
箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...
- [js高手之路] es6系列教程 - var, let, const详解
function show( flag ){ console.log( a ); if( flag ){ var a = 'ghostwu'; return a; } else { console.l ...
随机推荐
- 自动清理SQLServerErrorLog错误日志避免太大
问题描述:开启SQLServer自动备份后,备份文件越来越多,有没有及时清理,导致服务器空间不足,备份出错,以至于出现几个G的ErrorLog文件,影响系统的登录管理. 解决办法:定期清理SQLSer ...
- 【JavaScript学习】-JS内置对象2-Data对象
Date对象: Data对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 定义: //默认初始值定义: var dataName=new Date(); /*使用关键字new;Da ...
- 使用zabbix_agent监控第一台windows服务器
解压windows客户端压缩包 bin目录下会有win32和win64俩个文件夹,根据windows系统的版本自行进行选择,将客户端程序文件拷贝至C:\zabbix 将conf文件中的zabbix_a ...
- 如何相互转换逗号分隔的字符串和List
将逗号分隔的字符串转换为List 方法 1: 利用JDK的Arrays类 [java] view plain copy ico_fork.svg1.5 KB String str = " ...
- php追加数组
<?php //追加数组 array_merge_recursive()函数与array_merge()相同,可以将两个或多个数组合并在一起,形成一个联合的数组.两者之间的区别在于,当某个输入数 ...
- “HK”的日常之ARP断网攻击
ARP断网攻击是什么?可以吃吗?如果可以吃它好吃吗? ARP断网攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响 ...
- JVM总结之内存区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,有的区域是线程共享的,有的区域是线程隔离的.如下图: 程序计数器 程序计数器(Progra ...
- div自身高度、屏幕高度
获取元素高度 scrollWidth //显示当前元素的宽度 scrollHeight //显示当前元素的高度 scrollLeft //显示当前元素的左边距左侧的距离 scroll ...
- net::ERR_CONNCTION_ABORTED与http post request header is too large 错误
开始浏览器报(net::ERR_CONNCTION_ABORTED)然后就一直找这个错误是怎么引起的,找了一圈也没有找到答案. 后来看了一下后台发出后台错http post request heade ...
- ASP.NET Core 源码学习之 Logging[1]:Introduction
在ASP.NET 4.X中,我们通常使用 log4net, NLog 等来记录日志,但是当我们引用的一些第三方类库使用不同的日志框架时,就比较混乱了.而在 ASP.Net Core 中内置了日志系统, ...