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);

目录
相关文章
|
存储 缓存 关系型数据库
数据库优化
数据库优化
查看 npm 包下载量(简单快捷,数据精确)
查看 npm 包下载量(简单快捷,数据精确)
1136 0
|
8月前
鸿蒙开发:如何实现文本跑马灯效果
如果只是一个普通的跑马灯效果,而且Text文本组件中的TextOverflow.MARQUEE可以满足需求,以Text为主,如果你想控制文本的速度,暂停等功能,可以使用Marquee,如果你想实现复杂的场景滚动,比如图片,各种组件嵌套滚动,这种只能自己定义了。
230 1
鸿蒙开发:如何实现文本跑马灯效果
|
前端开发 JavaScript 测试技术
React 分页组件 Pagination
本文介绍了如何在 React 中从零构建分页组件,涵盖基础概念、常见问题及解决方案。通过示例代码详细讲解了分页按钮的创建、分页按钮过多、初始加载慢、状态管理混乱等常见问题的解决方法,以及如何避免边界条件、性能优化和用户反馈等方面的易错点。旨在帮助开发者更好地理解和掌握 React 分页组件的开发技巧,提升应用的性能和用户体验。
403 2
|
前端开发 JavaScript 开发者
利用代码分割优化前端性能:高级技巧与实践
【10月更文挑战第2天】在现代Web开发中,代码分割是优化前端性能的关键技术,可显著减少页面加载时间。本文详细探讨了代码分割的基本原理及其实现方法,包括自动与手动分割、预加载与预取、动态导入及按需加载CSS等高级技巧,旨在帮助开发者提升Web应用性能,改善用户体验。
|
数据采集 监控 安全
CDGA|数据治理:安全如何贯穿数据供给、流通、使用全过程
随着信息技术的飞速发展,数据已经成为企业运营、社会管理和经济发展的核心要素。然而,数据在带来巨大价值的同时,也伴随着诸多安全风险。因此,数据治理的重要性日益凸显,它不仅仅是对数据的简单管理,更是确保数据在供给、流通和使用全过程中安全、合规、高效的关键。
|
消息中间件 监控 Java
Java一分钟之-Spring Integration:企业级集成
【6月更文挑战第11天】Spring Integration是Spring框架的一部分,用于简化企业应用的集成,基于EIP设计,采用消息传递连接不同服务。核心概念包括通道(Channel)、端点(Endpoint)和适配器(Adapter)。常见问题涉及过度设计、消息丢失与重复处理、性能瓶颈。解决策略包括遵循YAGNI原则、使用幂等性和事务管理、优化线程配置。通过添加依赖并创建简单消息处理链,可以开始使用Spring Integration。注意实践中要关注消息可靠性、系统性能,逐步探索高级特性以提升集成解决方案的质量和可维护性。
388 3
Java一分钟之-Spring Integration:企业级集成
|
数据采集 物联网 数据挖掘
API接口的应用
API接口在现代技术中至关重要,它使不同软件、设备间能相互通信和数据共享。在社交网络中,如Facebook及Twitter的API让开发者能够构建交互式应用;移动应用则依赖API与服务器通信,实现天气查询、地图定位等功能;云计算平台如AWS通过API提供了资源管理和配置服务;物联网设备使用API实现数据交换;视频游戏开发商利用各类平台API发布游戏。此外,API爬虫数据接口技术通过爬虫抽取并输出数据,被广泛应用于获取商业、金融、医疗等领域的大数据,以支持数据分析、策略制定及业务流程优化,极大地提高了数据收集与处理的效率和准确性。
|
缓存 Java Ruby
程序与技术分享:Aviator表达式求值引擎开源框架
程序与技术分享:Aviator表达式求值引擎开源框架
558 0
|
移动开发 JavaScript 小程序
uView Tooltip 长按提示
uView Tooltip 长按提示
476 3
下一篇
oss云网关配置