当前位置: 首页 > news >正文

JavaScript权威指南(第7版) 笔记 - 扩展操作符总结

扩展操作符 ... ,不是真正意义上的JavaScript操作符。

let str = "0123ABC"
console.log(typeof ...str);// Uncaught SyntaxError: Unexpected token '...' 

上面的第2行代码会报错,扩展操作符 ... 只能在数组字面量、对象字面量、函数调用中使用。

在函数定义中, ... 称为剩余参数

.

一、扩展数组,复制数组内容

在数组中进行扩展,扩展的结果就是数组元素的形式

let a = [1, 2, 3];
let b = [0, ...a, 4];  // [0, 1, 2, 3, 4]

在对象中进行扩展,扩展的结果就是对象中属性-值的形式。
JavaScript中的数组是一种特殊的对象,索引是它的属性,索引位置的值是属性对应的值。

let a = [1, 2, 3];
let obj = {...a};  // {0: 1, 1: 2, 2: 3}

二、扩展普通对象,复制对象内容

⚠️(ES2018及之后版本)⚠️

在ES2018及之后,可以在对象字面量中使用“扩展操作符”…把已有对象的 属性和值 复制到新对象中:

let position = { x: 0, y: 0 };
let dimensions = { width: 100, height: 75 };
let rect = { ...position, ...dimensions }; // {x: 0, y: 0, width: 100, height: 75}
rect.x + rect.y + rect.width + rect.height // => 175

1、同名属性的值由后面对象决定

扩展对象和被扩展对象有一个同名属性,那么这个属性的值由后面的对象决定

let o = { x: 1 };
let p = { x: 0, ...o };
p.x   // => 1: the value from object o overrides the initial value
let q = { ...o, x: 2 };
q.x   // => 2: the value 2 overrides the previous value from o.

1.2、只扩展对象的自有属性

扩展操作符只扩展对象的自有属性,不扩展任何继承属性:

let o = Object.create({x: 1}); // o inherits the property x
let p = { ...o };
p.x                            // => undefined

三、扩展可迭代对象

可扩展迭代对象有:

  1. 字符串
  2. 数组
  3. Set
  4. Map

(1)扩展字符串

字符串也是可迭代对象

let str = "0123ABC"
let digits = [...str];
digits 	// => ['0', '1', '2', '3', 'A', 'B', 'C']
let obj = {...str}
obj 	// =>  {0: '0', 1: '1', 2: '2', 3: '3', 4: 'A', 5: 'B', 6: 'C'}

⚠️⚠️⚠️ 注意:扩展扩展到数组和扩展到对象的区别。

(2)扩展数组

参考:一、扩展数组

(3)扩展Set

let s = new Set();
s.add(1).add("1").add(1).add(2).add(3);
let arr = [...s]; // [1, '1', 2, 3]
let obj = {...s}; // {} ,空对象

(4)扩展Map

let m = new Map(); 
m.set("one", 1);   
m.set("two", 2);
let arr = [...m]; // [['one', 1], ['two', 2]]
let obj = {...m}; // {}

四、函数调用中使用扩展操作符

函数调用中使用扩展操作符,一般需要和剩余形参配合使用。如果形参不是剩余参数类型,则根据形参依次获取数组中的值。

⭐️⭐️⭐️ 在函数调用中使用扩展操作符,本质上传递的是数组类型的值。

(1)函数调用中使用扩展操作符,配合剩余参数使用

let str = "0123ABC"
console.log(getType(...str));// => object ,实际类型是数组,见下图1let set = new Set();
set.add(1).add(2).add(3);
console.log(getType(...set));// => object ,实际类型是数组,见下图2function getType(...p) {console.log("v:", p);return (typeof p);
}

图1:
在这里插入图片描述
图2:
在这里插入图片描述

(2)函数调用中使用扩展操作符,未配合剩余参数使用

let str = "0123ABC"
console.log(getType(...str));// => stringfunction getType(p) {console.log("v:", p);// v:'0'return (typeof p);
}

相关文章:

  • 小林coding图解计算机网络|TCP篇06|如何理解TCP面向字节流协议、为什么UDP是面向报文的协议、如何解决TCP的粘包问题?
  • 律所如何做好内容运营,提升品牌影响力
  • 数据生成 | Matlab实现基于DE差分进化算法的数据生成
  • vue + koa + Sequelize + 阿里云部署 + 宝塔:宝塔数据库连接
  • OpenCV中的模块:三维重建-SFM(1)
  • 设计模式 --5观察者模式
  • 威胁建模与网络安全测试方法
  • Android adb 常用命令
  • mysql的一些基本操作
  • Oracle 使用维进行查询重写
  • Flutter Don‘t use ‘BuildContext‘s across async gaps.
  • Jmeter各组件超详细介绍
  • Git命令(1)[删除,恢复与移动]
  • Stable Diffusion WebUI 图片信息(PNG Info)
  • H5面临的网络安全威胁和防范措施
  • @jsonView过滤属性
  • k8s如何管理Pod
  • Leetcode 27 Remove Element
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • maya建模与骨骼动画快速实现人工鱼
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node 版本过低
  • node.js
  • ubuntu 下nginx安装 并支持https协议
  • 第2章 网络文档
  • 关于List、List?、ListObject的区别
  • 记一次和乔布斯合作最难忘的经历
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 限制Java线程池运行线程以及等待线程数量的策略
  • #DBA杂记1
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一)Linux+Windows下安装ffmpeg
  • (转)http协议
  • (转)使用VMware vSphere标准交换机设置网络连接
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .aanva
  • .net mvc 获取url中controller和action
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .NET委托:一个关于C#的睡前故事
  • .pyc文件是什么?
  • @Async注解的坑,小心
  • @media screen 针对不同移动设备
  • @NestedConfigurationProperty 注解用法
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [1] 平面(Plane)图形的生成算法
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [ASP]青辰网络考试管理系统NES X3.5