javascript es6系列教程 - 不定参数与展开运算符(...)
三个点(...)在es6中,有两个含义:
- 用在形参中, 表示传递给他的参数集合, 类似于arguments, 叫不定参数. 语法格式: 在形参面前加三个点( ... )
- 用在数组前面,可以把数组的值全部打散,展开,叫展开运算符. 语法格式: 在数组面前加三个点( ... )
求不定参数的和,以前可以用arguments来做,现在可以用不定参数来做,如下:
![](https://common.cnblogs.com/images/copycode.gif)
1 function add( ...values ){
2 console.log( values ); // [10, 20, 30]
3 let sum = 0;
4 for( let i = 0, len = values.length; i < len; i++ ){
5 sum += values[i];
6 }
7 return sum;
8 }
9 var res = add( 10, 20, 30 );
10 console.log( res ); //60
![](https://common.cnblogs.com/images/copycode.gif)
1 function add( ...keys, last ) { //报错,不定参数只能放在最后面
2
3 }
1 // function add( ...key1, ...key2 ){ //报错,一个函数不能出现多个不定参数
2
3 // }
筛选拷贝对象的属性,之前我们是这样子做的:
![](https://common.cnblogs.com/images/copycode.gif)
1 function pick( src ){
2 let target = Object.create( null );//创建一个空对象,跟new Object不同
3 for( let i = 1, len = arguments.length; i < len; i++ ){
4 target[arguments[i]] = src[arguments[i]];
5 }
6 return target;
7 }
8 let user = {
9 name : 'ghostwu',
10 age : 22,
11 sex : 'man',
12 };
13 var obj = pick( user, 'name', 'age' ); //拷贝user对象的name和age属性
14 console.log( obj ); //{name: "ghostwu", age: 22}
![](https://common.cnblogs.com/images/copycode.gif)
这样做没有什么问题,读取属性我们始终要记得从1开始, 因为arguments对象的索引0 被 src这个参数占据了. 用不定参数修改如下:
![](https://common.cnblogs.com/images/copycode.gif)
1 function pick( src, ...keys ){
2 console.log( keys ); //['name','age'];
3 let target = Object.create( null );
4 for( let i = 0, len = keys.length; i < len; i++ ){
5 target[keys[i]] = src[keys[i]];
6 }
7 return target;
8 }
9
10 let user = {
11 name : 'ghostwu',
12 age : 22,
13 sex : 'man',
14 };
15
16 var obj = pick( user, 'name', 'age' );
17 console.log( obj );
![](https://common.cnblogs.com/images/copycode.gif)
以上方式,更符合数组操作习惯, 拿来就用,不要老是记着从1开始
不定参数与arguments类似,当初设计的目的就是为了取代arguments,那不定参数会不会影响arguments呢?
![](https://common.cnblogs.com/images/copycode.gif)
1 function show( ...keys ){
2 console.log( keys.length ); //3
3 console.log( arguments.length ); //3
4 keys[0] = 1000;
5 console.log( keys[0], keys[1], keys[2] ); // 1000,20,30
6 console.log( arguments[0], arguments[1], arguments[2] ); //10,20,30
7 }
8 show( 10, 20, 30 );
![](https://common.cnblogs.com/images/copycode.gif)
不定参数修改之后,arguments并不会受到影响
展开运算符:
1 let a = 10, b = 20;
2 console.log( Math.max( a, b ) ); //20
1 let arr = [ 1, 3, 0, -1, 20, 100 ];
2 console.log( Math.max( arr ) );//NaN, max不能接收数组参数
我们可以借助apply的语法,把数组传递进去
1 let arr = [ 1, 3, 0, -1, 20, 100 ];
2 console.log( Math.max.apply( Math, arr ) );//100
有了展开运算符之后,更简单
1 let arr = [ 1, 3, 0, -1, 20, 100 ];
2 console.log( Math.max( ...arr ) ); //100 ...: 把数组展开
3 console.log( Math.max( ...arr, 1000 ) ); //1000
javascript es6系列教程 - 不定参数与展开运算符(...)的更多相关文章
- [js高手之路] 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, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...
- JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...
- [js高手之路]es6系列教程 - 解构详解
解构通俗点说,就是通过一种特定格式,快捷的读取对象/数组中的数据的方法, es6之前,我们通过对象名称[键] 读取数据 var User = { 'name' : 'ghostwu', 'age' : ...
- 《JavaScript语言入门教程》记录整理:运算符、语法和标准库
目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...
- [js高手之路] es6系列教程 - 函数的默认参数详解
在ES6之前,我们一般用短路表达式处理默认参数 function show( a, b ){ var a = a || 10; var b = b || 20; console.log( a, b ) ...
- 《无所不能的JavaScript编程系列:arguments 参数对象》
前言:无所不能的JavaScript JavaScript起源于Netscape公司的LiveScript语言,这是一种基于对象和事件驱动的客户端脚本语言,最初的设计是为了检验HTML表单输入的正确性 ...
- [js高手之路] es6系列教程 - 箭头函数详解
箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...
随机推荐
- 第 3 章 镜像 - 016 - Dockerfile 常用指令
Dockerfile 常用指令 1.FROM 指定base镜像2.MAINTAINER 设置镜像的作者,可以为任意字符串3.COPY 从build context 复制到镜像 COPY 支持两种形式: ...
- python+opencv 运行环境搭建
1:安装pycharm,验证码你懂的 2:安装python3.5以上,或3.6,python2和3 的版本差异还蛮大 3:安装opencv,如下图 以上是方法一,还有之中方法是下载whl文件再手动安装 ...
- C语言逗号运算符和逗号表达式基础总结
逗号运算符的作用: 1,起分隔符的作用: 定义变量用于分隔变量:int a,b输入或输出时用于分隔输出表列 printf("%d%d",a,b) 2,用于逗号表达式的顺序运算符 语 ...
- 雷林鹏分享:XML 应用程序
XML 应用程序 本章演示一些基于 XML, HTML, XML DOM 和 JavaScript 构建的小型 XML 应用程序. XML 文档实例 在本应用程序中,我们将使用 "cd_ca ...
- ES7: 展开语法spread syntax:
第一次遇到: payload = {...payload, manufacturer: state.manufacturers.filter(x => x._id === payload.man ...
- android--------Socket的简单了解
Socket目录 Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连 ...
- memtrack: Couldn't load memtrack module (No such file or directory) 的问题解决
通过了编译,可是在模拟器运行时,却出现stopping…….查看logcat,发现出现错误: E/memtrack: Couldn't load memtrack module (No such fi ...
- Spring Framework启动详解
之前一直对Spring启动的过程很迷糊,所以这次国庆梳理一下. Spring启动一言以蔽之:创建一个根应用上下文.(因为其他的所有的应用上下文都可以通过各种方式继承它) (一)了解应用上下文 Spri ...
- Educational Codeforces Round 2 E - Lomsat gelral
题意:每个节点有个值,求每个节点子树众数和 题解:可线段树合并,维护每个数出现次数和最大出现次数,以及最大出现次数的数的和 //#pragma GCC optimize(2) //#pragma GC ...
- 【PowerDesigner】【2】将工具栏显示出来
问题:我的软件一打开,没有工具栏 解决方案:Tools→Customize Menus and Tools→Palette→Close 参考文档: PowerDesigner如何将消失的工具栏显示出来 ...