JavaScript – Rest Parameters & Spread Operator
介绍
Rest 和 Spread 的共同点是语法都是 ... (点点点). 但它们的概念是相反的. 看例子体会:
Rest Parameters
参考: 阮一峰 – rest 参数
rest parameters 可以替代 arguments 对象.
old school:
function method(v1, v2, v3) {
console.log(arguments[0]);
console.log(arguments[1]);
console.log(arguments[2]);
console.log(arguments[3]); // 4
console.log(arguments.length); // 4
console.log(Array.isArray(arguments)); // false
// arguments is iterable
for (const arg of arguments) {
console.log('arg', arg);
}
}
method(1, 2, 3, 4);
modern:
function method(...args) {
console.log(Array.isArray(args)); // true
}
method(1, 2, 3, 4);
除了它是 array 以外, 其它都和 arguments 一样,
left arguments
除了可以取代 arguments 对象, 它还可以更灵活.
function method(firstArg, ...leftArgs) {
console.log(firstArg); // 1
console.log(leftArgs); // [2, 3, 4]
}
method(1, 2, 3, 4);
直接把 arguments 拆成 2 组, 是不是很方便?
注: rest parameters 只能放到最后一个 parameter 哦, 下面这样放中间是不行的哦

use in destructuring assignment
const [v1, ...others] = [1, 2, 3, 4];
和 left arguments 同个概念, 只是用在 destructuring assignment 上. (rest 依然必须在最后一个哦)
解构对象也是可以的
const { name, ...leftProperties } = { name: 'Derrick', age: 11 };
console.log(leftProperties.age); // 11
Spread Operator
参考:
spread operator 可以用在 array 和 object 上, 先看看 array 的用法.
spread array to parameters
function method(a, b, c) {}
method(1, 2, 3);
method(...[1, 2, 3]);
method(1, ...[2, 3]);
rest parameters 是把多个值 combine 到一个 array 里. spread operator 有点相反的味道.
它把一个 array 拆成多个 parameters 输入.
spread array fill into array
const array1 = [1, 2, 3];
const array2 = [...array1, 4, 5]; // [1, 2, 3, 4, 5]
array1 被拆成一个一个放入新的 array 中.
如果 array 是空的, 那什么也不会发生.
const array3 = [...[], 4, 5]; // [4, 5]
spread object fill into object
这个是 ES2018 才有哦.
和 fill into array 玩法一样
const obj1 = { age: 11 };
const obj2 = {
name: 'Derrick',
age: 10,
...obj1,
level: 50,
};
// obj2 = { name: 'Derrick', age: 11, level: 50 }
obj1.age 11 覆盖掉了原本的 obj2.age 10, 上面这个写法和 Object.assign 是等价的哦.
小心 undefined
const obj1 = {
name: undefined,
};
const obj2 = {
name: 'Derrick',
...obj1,
};
console.log(obj2.name); // undefined
Object.assign 也会这样哦. 所以要特别小心. 有 2 个解决方法:
第一是针对属性做判断
const obj1 = {
name: undefined,
};
const obj2 = {
name: 'Derrick',
...(obj1.name !== undefined ? { name: obj1.name } : undefined),
};
console.log(obj2.name); // 'Derrick'
当 obj1.name 有值就变成 ...{ name: obj1.name } 不然就是 ...undefined, 然后 undefined 会被强转成 empty object 最终就是 ...{} 啥也没有就抵消掉了.
另一个方法是自己封装一个 Object.Assign, 自己 loop key 检查是否是 own property 才 override.
总结
Rest Parameters 像 "收", 把多个值收集到一个 array 或 object 中.
Spread Operator 像 "放" 把 array 或 object 里的值, 释放开来.
可以同时 "放" 多个, 但是不能 "收" 多个.
const a = [1, 2];
const b = [4, 5];
const c = [...a, 3, ...b]; // 同时释放 2 个 const [...a, 3, ...b] = [1, 2, 3, 4, 5]; // error! 同时收 2 个是不可以的 (因为它不知道要 combine 多少个丫)
JavaScript – Rest Parameters & Spread Operator的更多相关文章
- JavaScript展开操作符(Spread operator)介绍
本文介绍JavaScript的展开操作符(Spread operator)....本文适合ES6初学者. 你可以通过展开操作符(Spread operator)...扩展一个数组对象和字符串.展开运算 ...
- JavaScript剩余操作符Rest Operator
本文适合JavaScript初学者阅读 剩余操作符 之前这篇文章JavaScript展开操作符(Spread operator)介绍讲解过展开操作符.剩余操作符和展开操作符的表示方式一样,都是三个点 ...
- 《理解 ES6》阅读整理:函数(Functions)(三)Function Constructor & Spread Operator
增强的Function构造函数(Increased Capabilities of the Function Constructor) 在Javascript中Function构造函数可以让你创建一个 ...
- [ES6] 13. Using the ES6 spread operator ...
The spread operator (...) allows you to "explode" an array into its individual elements. S ...
- [ES6] 23. Rest Parameters & Spread Parameters
Rest Parameters: In ES5, when you don't know how many paramters will be passed in, you can use argum ...
- [译]Javascript中的Ternary operator
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- [Python] Object spread operator in Python
In JS, we have object spread opreator: const x = { a: '1', b: '2' } const y = { c: '3', d: '4' } con ...
- [ES6系列-06]展开操作符 Spread Operator 就像解压到这里
[原创]码路工人 Coder-Power 大家好,这里是码路工人有力量,我是码路工人,你们是力量. github-pages 博客园cnblogs 在前面的文章中,介绍了...在获取剩余参数中的作用. ...
- [ES6] ... spread operator
var parts = ['shoulders', 'knees']; var lyrics = ['head', ...parts, 'and', 'toes']; // ["head&q ...
- 现在就可以使用的5个 ES6 特性
小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货.各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握. ...
随机推荐
- redis基本数据结构-有序集合
redis基本数据结构-有序集合zset 特性 使用哈希表+跳表数据结构存储 每个元素由 分数和字段名 两部分组成 增加元素 zadd key score1 member1 [score2 membe ...
- 数据仓库建模工具之一——Hive学习第一天
hive分布式搭建文档 谷歌浏览器下载网址:Google Chrome – Download the fast, secure browser from Google 华为云镜像站:https://m ...
- leetcode简单(数组,字符串,链表):[168, 171, 190, 205, 228, 448, 461, 876, 836, 844]
目录 168. Excel表列名称 171. Excel 表列序号 190. 颠倒二进制位 205. 同构字符串 228. 汇总区间 448. 找到所有数组中消失的数字 461. 汉明距离 876. ...
- oeasy 教您玩转 linux 010214 画面转文字 asciiview
- oeasy教您玩转vim - 27 - 文件类型
文件类型 回忆上节课内容 上次了解了缩进的各种方式 正常模式下用 << 缩进 插入模式下用 tab 缩进 显示缩进情况 :set listchars=eol:$,tab:>-,s ...
- 【jQuery学习日记】从入门到再入门
1,jQuery介绍 jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. 2,入门jQuery jQuery有两大核心:jQuery核心函数和j ...
- 关于使用c++制作蓝牙连接,Windows版本
1 #define _CRT_SECURE_NO_WARNINGS 2 #pragma warning(disable : 4995) 3 #include <iostream> 4 #i ...
- 这才是 PHP 高性能框架 Workerman 的立命之本
大家好,我是码农先森. 在这个大家都崇尚高性能的时代,程序员的谈笑间句句都离不开高性能,仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low,其中众所皆知的 Nginx 就是高性能的代表.有些朋友可 ...
- docker 构建镜像拉取镜像生成实例
实战tomcat镜像 准备镜像文件 编写dockerfile 首先将tomcat和jdk软件包上传 创建tomcat文件夹,将文件传送到tomcat文件夹 创建Dockerfile(不用加-f指定)文 ...
- 【Windows】远程访问设置
Windows自带了远程访问功能: Win + R 打开运行,输入[mstsc] 连接需要提供主机地址,和用户账号 下面的选项可以保存此连接为文件,下一次连接直接打开文件即可访问 当然设置了以后可能还 ...