JavaScript展开操作符(Spread operator)的应用详解

你可以通过展开操作符(Spread operator)...扩展一个数组对象和字符串。展开运算符(spread operator)是三个点(...),可以将可迭代对象转为用逗号分隔的参数序列,也就是说将可迭代的对象的值传递到函数的参数中。如同rest参数的逆运算。

用于数组

以数组为例,首先创建一个数组,

javascript 复制代码
const a = [1, 2, 3],b = [4,5,6];

你可以轻松赋值一个数组:

javascript 复制代码
const c = [...a] // [1,2,3]

你还可以轻松拼接两个数组:

javascript 复制代码
const d = [...a,...b] // [1,2,3,4,5,6]

也可以如下拼接

javascript 复制代码
const d = [...a,4, 5, 6] // [1,2,3,4,5,6]

如果要把一个数组b的元素全部插入到数组a的后面(不生成新数组),可以这样操作:

javascript 复制代码
const a = [1,2,3];
const b = [4,5,6];
a.push(...b);
console.log(a); // [1, 2, 3, 4, 5, 6]

如果要把一个数组b的元素全部插入到数组a的前面(不生成新数组),可以这样操作:

javascript 复制代码
​const a = [1,2,3];
const b = [4,5,6];
a.unshift(...b);
console.log(a); // [4, 5, 6, 1, 2, 3]

类数组对象变成数组

可以通过展开运算符把类数组对象变成真正的数组:

javascript 复制代码
var list=document.getElementsByTagName('a');
var arr=[..list];

用于对象

展开操作符同样可以用于对象。可以通过以下方式clone一个对象:

javascript 复制代码
const newObj = { ...oldObj }

注意:如果属性值是一个对象,那么只会生成一个指向该对象的引用,而不会深度拷贝。也就是说,展开运算符不会递归地深度拷贝所有属性。并且,只有可枚举属性会被拷贝,原型链不会被拷贝。

还可以用于merge两个对象。

javascript 复制代码
const obj1 = { a: 111, b: 222 };

const obj2 = { c: 333, d: 444 };

const merged = { ...obj1, ...obj2 };

console.log(merged); // -> { a: 111, b: 222, c: 333, d: 444 }

当然也可以适用于以下的情况:

javascript 复制代码
const others = {third: 3, fourth: 4, fifth: 5}

const items = { first:1, second:1, ...others }

items //{ first: 1, second: 2, third: 3, fourth: 4, fifth: 5 }

如果merge的多个对象有相同属性,则后面的对象的会覆盖前面对象的属性,比如:

javascript 复制代码
const obj1 = { a: 111, b: 222 };

const obj2 = { b: 333, d: 444 };

const merged = { ...obj1, ...obj2 };

console.log(merged); // -> { a: 111, b: 333, d: 444 }



const obj1 = {a:111,b:222}

const merged = {a:222,...obj1};

console.log(merged); // -> {a: 111, b: 222}



const obj1 = {a:111,b:222}

const merged = {...obj1,a:222};

console.log(merged); // -> { a: 222, b: 222 }

用于字符串

通过展开操作符,可以把一个字符串分解成一个字符数组,相当于

javascript 复制代码
const hey = 'hey'

const arrayized = [...hey] // ['h', 'e', 'y']

以上代码相当于:👇

javascript 复制代码
const hey = 'hey'

const arrayized = hey.split('') // ['h', 'e', 'y']

用于函数传参

通过展开操作符,可以通过数组给函数传参:

javascript 复制代码
const f = (foo, bar) => {}

const a = [1, 2]

f(...a)


const numbers = [1, 2, 3, 4, 5]

const sum = (a, b, c, d, e) => a + b + c + d + e

const sum = sum(...numbers)

console.log(Sum) // 15

用于具有 Iterator 接口的对象

具有 Iterator 接口的对象Map 和 Set 结构,Generator 函数,可以使用展开操作符,比如:

javascript 复制代码
var s = new Set();
s.add(1);
s.add(2);
var arr = [...s] // [1,2]


function * gen() {  
  yield 1;  
  yield 2;  
  yield 3; 
}


var arr = [...gen()] // 1,2,3

如果是map,会把每个key 和 value 转成一个数组:

javascript 复制代码
var m = new Map();

m.set(1,1)

m.set(2,2)

var arr = [...m] // [[1,1],[2,2]]

注意以下代码会报错,因为obj不是一个 Iterator 对象:

javascript 复制代码
var obj = {'key1': 'value1'};

var array = [...obj]; // TypeError: obj is not iterable

◼️ 了解ES6 --- Generator 函数的语法


参考资料

展开语法 - JavaScript | MDN | 展开运算符 - JavaScript | MDN |

JavaScript展开运算符和剩余运算符的区别 | ES6展开运算符

------ JS高级------ | ES6_参数增强、解构的简谈与应用

相关推荐
CodeClimb1 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
光头程序员4 小时前
grid 布局react组件可以循数据自定义渲染某个数据 ,或插入某些数据在某个索引下
javascript·react.js·ecmascript
fmdpenny5 小时前
Vue3初学之商品的增,删,改功能
开发语言·javascript·vue.js
小美的打工日记5 小时前
ES6+新特性,var、let 和 const 的区别
前端·javascript·es6
涔溪5 小时前
有哪些常见的 Vue 错误?
前端·javascript·vue.js
程序猿online5 小时前
前端jquery 实现文本框输入出现自动补全提示功能
前端·javascript·jquery
Turtle7 小时前
SPA路由的实现原理
前端·javascript
HsuYang8 小时前
Vite源码学习(九)——DEV流程中的核心类(下)
前端·javascript·架构
傻小胖8 小时前
React 中hooks之useInsertionEffect用法总结
前端·javascript·react.js
蓝冰凌9 小时前
【整理】js逆向工程
javascript·js逆向