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,技术干货尽在掌握. ...
随机推荐
- MySql(Innodb)事务隔离级别
事务将数据库从一个一致状态转换至另外一个一致状态,若某个事务看到了另外一个事务在状态转换过程中的中间态数据(不一致状态),将有可能导致另外一个事务的操作基于一个不一致的数据库状态,进而数据库失去一致性 ...
- 在Django中,多数据操作,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中
在Django中,你可以编写测试来查询另一个数据库服务器中的数据,并将结果导入当前Django项目的数据库表中.下面是一个简单的示例: 假设你有一个Django应用程序,名为myapp,并且你希望从另 ...
- oeasy教您玩转vim - 20 - 显示标尺
显示标尺 回忆上节课内容 定义标记 a ma 删除标记 a :delm a 跳转到标记 a 'a `a 跳到 a 对应的行和列 'a 跳到 a 对应的行 查看所有标记 :marks 各种标记类型 '' ...
- PHP现代化构建工具: 无需修改任何代码和扩展将你的ThinkPHP项目性能提高20倍
我要分享一个令人激动的黑科技:PRipple 使用这个项目能够在无需修改任何代码且无需第三方扩展的前提下,将你的 Laravel 项目性能提高 20 倍.他仅仅依赖于PHP原生的 pcntl/posi ...
- XXL-JOB初见
XXL-JOB是轻量级分布式任务调度平台 port:8088 初始账号:admin/123456 主要有调度中心.执行器.任务 执行流程: 1.执行器向调度中心上报任务 2.调度中心为执行器分配任务 ...
- JSR303统一校验使用
JSR303也称为bean validation,定义了一套bean验证规范.通过注解的方式关联属性与规则 使用方式 1.引入依赖 <dependency> <groupId> ...
- 如何为spring配置全局抛出异常注解
0.首先了解一个注解@ControllerAdvice,他是spring里的一个注解,用于定义全局逻辑异常.数据绑定.请求处理等逻辑,与@ExceptionHandler等注解使用. Controll ...
- Jmeter二次开发函数 - 文本替换
此篇文章将在Jmeter创建一个新函数,实现替换文本中的指定内容功能.效果图如下 1.eclipse项目创建步骤此处省略,可参考上一篇Jmeter二次开发函数之入门 2.新建class命名为" ...
- Bulk RNA-seq 基本分析流程
目的: 对illumina数据进行处理,利用 RNA-Seq 发现新的 RNA 变体和剪接位点,或量化 mRNA 以进行基因表达分析等.对两组或多组样本的转录组数据,通过差异表达分析和对所发现的差异表 ...
- AI领域的国产显卡如何在现有技术下吸引用户 —— 廉价增加显存 —— 大显存
先给出一个不大准确的但相差不差的背景介绍: 同样性能级别的显卡,NVIDA的24G的要3W,32G的要5W,48G的要7W, 80G的要10W. 国产同同性能的显卡32G的要10W,48G的要15W, ...