ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)

简介: ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)

使用场景1——拓展数组

let list1 = [1, 2, 3];

let finalList = [...list1, 4];

console.log(finalList); // [ 1, 2, 3, 4 ]
let list1 = [1, 2, 3];
let list2 = [5, 6];

let finalList = [...list1, 4, ...list2];

console.log(finalList); // [ 1, 2, 3, 4, 5, 6 ]

使用场景2——拓展对象

let oldDic = {
  a: 1,
};

let newDic = {
  ...oldDic,
  b: 2,
};

console.log(newDic); // { a: 1, b: 2 }

多对象拓展属性覆盖

多个对象拓展合并时,若对象的属性相同,则后拓展的对象属性值会覆盖之前的对象属性值。

let oldDic = {
  name: "旧名字",
};

let newDic = {
  name: "新名字",
};

let finalDic = {
  ...oldDic,
  ...newDic,
};

console.log(finalDic); // 得到 { name: '新名字' }

实战技巧——给参数赋默认值

借助多对象拓展属性覆盖的特点,给参数赋默认值,以查询列表为例:

// 默认参数值
let defaultParams = {
  name: "默认查询的名称",
  pageIndex: 1,
  pageSize: 10,
};

// 页面传入的参数值
let currentParams = {
  name: "本次查询的名字",
  pageIndex: 4,
};

// 最终查询的参数值
let finalParams = {
  ...defaultParams,
  ...currentParams,
};

console.log(finalParams);

打印结果

{ 
  name: '本次查询的名字',
  pageIndex: 4, 
  pageSize: 10 
}

使用场景3——函数多参数传递

let data = [1, 2];

function sum(a, b) {
  return a + b;
}

let result = sum(...data);

console.log(result);

不使用扩展运算符的写法为:

let data = [1, 2];

function sum(a, b) {
  return a + b;
}

let result = sum(data[0], data[1]);

console.log(result);

可见使用扩展运算符更方便

使用场景4——解构赋值

与解构配合时,扩展运算符只能用在最后一个上

let [a, b, ...list] = [1, 2, 3, 4, 5, 6];
console.log(a); // 1
console.log(b); // 2
console.log(list); // [ 3, 4, 5, 6 ]

实现原理

将实现了Iterator 接口的对象中的每个元素一个个迭代取出单独使用。

因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,如Set,Map,生成器

let set1 = new Set()
set1.add(1)
set1.add(2)
console.log(...set1) // 1 2
let map1 = new Map();
map1.set('k1', 1);
map1.set('k2', 2);
console.log(...map1) // [ 'k1', 1 ] [ 'k2', 2 ]
let go = function* () {
  yield 1;
  yield 2;
  yield 3;
};

console.log(...go());

错误的用法

只有函数调用时,扩展运算符才可以放在圆括号中,否则会报错。

(...[1, 2])
// Uncaught SyntaxError: Unexpected number

对象不是Iterator接口实现,所以不能直接拓展

// 会报错 Found non-callable @@iterator
console.log(
  ...{
    a: 1,
    b: 2,
  }
);
// 没有报错,但什么都不会打印
let dic = {
  a: 1,
  b: 2,
};

console.log(...dic);

目录
相关文章
|
存储 缓存 关系型数据库
数据库优化
数据库优化
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
2220 0
Threejs使用精灵Sprite作为标签,鼠标悬浮精灵上时鼠变小手
|
Java 数据库连接 mybatis
Mybatis使用注解方式实现批量更新、批量新增
Mybatis使用注解方式实现批量更新、批量新增
1054 1
|
9月前
|
人工智能 IDE 开发工具
AI 编程,一键生成完整工程代码(企业级),开启零代码时代
飞算JavaAI是一款IDE插件,能将文字需求一键生成企业级完整工程代码,大幅提升开发效率。支持模块拆分、代码分层、数据库脚本生成,并可自定义代码风格与架构,适配团队规范。实现“零代码”开发与功能扩展,让开发者专注核心逻辑,告别重复编码。
Vue3——基于tdesign封装一个通用的查询组件
Vue3——基于tdesign封装一个通用的查询组件
599 3
|
缓存 JavaScript 前端开发
vue-router学习二:动态路由(路由传递数据的一种方式),路由懒加载,嵌套路由,路由传递参数方式,导航守卫,keep-alive标签
这篇文章主要介绍了Vue Router的高级用法,包括动态路由、路由懒加载、嵌套路由、路由参数传递、导航守卫以及keep-alive的使用。
986 0
vue-router学习二:动态路由(路由传递数据的一种方式),路由懒加载,嵌套路由,路由传递参数方式,导航守卫,keep-alive标签
|
前端开发 JavaScript 开发者
利用代码分割优化前端性能:高级技巧与实践
【10月更文挑战第2天】在现代Web开发中,代码分割是优化前端性能的关键技术,可显著减少页面加载时间。本文详细探讨了代码分割的基本原理及其实现方法,包括自动与手动分割、预加载与预取、动态导入及按需加载CSS等高级技巧,旨在帮助开发者提升Web应用性能,改善用户体验。
|
Java Nacos Sentinel
牛逼!这份神仙级Spring Cloud Alibaba全套笔记,几乎涵盖了所有操作
Spring Cloud 和微服务的重要性大家都知道了,Spring Cloud 现在已经成了微服务事实上的标准框架,也是 Java 程序员必须掌握的技术系列之一。
|
前端开发
ThreeJs通过canvas和Sprite添加标签
这篇文章介绍了在Three.js中利用Canvas和Sprite实现动态文本标签的方法,使得标签可以跟随模型并在3D空间中始终保持面向摄像机。
951 0
ThreeJs通过canvas和Sprite添加标签
[已解决]npm淘宝镜像最新官方指引(2023.08.31)
[已解决]npm淘宝镜像最新官方指引(2023.08.31)
7980 0