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

展开语法、剩余语法

展开语法定义

展开语法Spread Syntax,可以在函数调用/数组构造时,将数组表达式或者string在语法层面展开;还可以在构造字面量对象时,将对象表达式按照key-value的方式展开。(字面量一般指[1, 2, 3]或者{name:"mdn"}这种简洁的构造方式)。

展开语法
函数调用
myFunction(...iteratorObj);
字面量数组构造或字符串
[...iteratorObj, '4', ...'hello', 6]
构造字面量对象时,进行克隆或者属性拷贝(ECMAScript2018规范新增特性)

需要我们注意的是,此时通过Spread Syntax克隆或者属性拷贝属于浅拷贝。

let objClone = { ...obj };
展开语法示例
在函数调用时使用展开语法

如果我们像要将args数组中的元素迭代为函数参数,一般使用Function.prototype.apply的方式进行调用。因为apply方法可以接收一个数组或者类数组对象,其中的数组元素将作为单独的参数传给调用的函数。

function myFunction(x, y, z) {}
var args = [1, 2, 3];
myFunction.apply(null, args);

如果有了展开语法Spread Syntax语法,我们可以写成:
myFunction(...args)表示什么意思呢?我们主要关注...args的操作,...args此时表示将args数组进行**展开操作。**那么展开之后,实际上整体的效果相当于myFunction(1, 2, 3),所以效果是和上面例子相同。

function myFunction(x, y, z) {}
var args = [1, 2, 3];
myFunction(...args);
在new表达式中应用

使用new关键字来调用构造函数是,不能直接使用数组+apply的方式。(apply执行的是调用[[call]],而不是构造[[Constructor]])。
此时我们是不能够直接通过apply的方式去调用myFunction函数,因为apply方法调用的是[[call]] internal Property,而不是[[Constructor]] internal Property,所以不能够达到目的。

function myFunction(x, y, z){};
var args = [1, 2, 3];
new myFunction.apply(null, args);
如果有了展开语法`Spread Syntax`,我们可以写成:
var dateFields = [1970, 0, 1];
var d = new Date(...dateFields);

如果不使用展开语法的话,想要将数组元素传递给构造函数,实现的方式可能是这样的:
主要的思路:虽然我们不能直接通过new myConstructor.apply(null, myArguments)的方式将myArguments数组中的元素传递给构造函数myConstructor。但是我们可以找一个缓冲层做铺垫,比如例子中的partial函数。

  1. 疑问一:return constructor.apply(this, args)在做些什么?主要是使用借用构造函数的方式去处理实例化对象内部的属性。
  2. 疑问二:return constructor.apply(this, args)为什么要return,此时的结果是return undefined,为什么不会影响到程序的执行呢?因为new关键字调用构造函数时,构造函数内部会自动创建this对象,并且将this对象返回出去。如果你手动返回原始值的话,是不会对构造函数返回值造成影响。如果你返回的是**引用值,**此时才会受到影响。
function applyAndNew(constructor, args) {function partial() {// 借用构造函数return constructor.apply(this, args);}if (typeof constructor.prototype === 'object') {// 继承关系 partial => 继承 => myConstructorpartial.prototype = Object.create(constructor.prototype);}return partial;
}function myConstructor() {console.log("arguments.length: " + arguments.length);console.log(arguments);this.prop1="val1";this.prop2="val2"
}var myArguments = ["hi", "how", "are", "you", "mr", null];
var myConstructorWithArguments = applyAndNew(myConstructor, myArguments);
console.log(new myConstructorWithArguments);
构造字面量数组时使用展开语法

没有展开语法的时候,只能使用push、splice、concat等方法,来将已有数组元素变成新数组的一部分。有了展开语法,通过字面量方式,构造新数组会变得更简单,更优雅。

var parts = ['shoulders', 'knees'];
var lyrics = ['head', ...parts, 'and', 'toes'];
构造字面量对象时使用展开语法

Rest/Spread Properties for ECMAScript提议对字面量对象增加了展开的特性。其行为是,将已有对象的所有可枚举属性拷贝到新构造的对象中。
对象合并,对象浅拷贝你可以使用展开语法。

var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };var clonedObj = { ...obj1 };
// 克隆后的对象:{ foo: "bar", x: 42 }var mergedObj = { ...obj1, ...obj2 };
// 合并后的对象:{ foo: "baz", x: 42, y: 13 }
只用于可迭代对象

数组或者函数参数中使用展开语法时,该语法只能用于可迭代对象:

var obj = {'key1': 'value1'};
var array = [...obj]; // TypeError: obj is not iterable
展开多个值

在函数调用时使用展开语法,请注意不能超过JavaScript引擎限制的最大参数个数。

剩余语法(剩余参数)定义

剩余语法Rest Syntax看起来和展开语法完全相同,不同在于,剩余参数用于解构数组和对象。从某种意义上来说,剩余语法和展开语法是相反的:展开语法将数组展开为其中的各个元素,而剩余语法则是将多个元素收集起来并“凝聚”为单个元素。
剩余参数语法允许我们将一个不定数量的参数表示为一个数组。

剩余语法的描述

如果函数的最后一个命名参数以...为前缀,则它将成为一个由剩余参数组成的真数组,其中从0包括到theArgs.length(排除)的元素由传递给函数的实际参数提供。
在下面的例子中,thisArgs将收集该函数的第三个参数(因为第一个参数被映射到a,而第二个参数映射到b)和所有后续参数。

function(a, b, ...theArgs) {// ...
}
剩余参数和arguments对象的区别

剩余参数和arguments对象之间的区别主要在于:

  1. 剩余参数只包含哪些没有对应形参的实参,而arguments对象包含了传给函数的所有实参。
  2. arguments对象不是一个真正的数组,而剩余参数是真正的Array实例,也就是说你能够在它上面直接使用所有的数组方法。
  3. arguments对象还有一些附加的属性,比如callee
解构剩余参数

剩余参数可以被解构,这意味着他们的数据可以被解包到不同的变量中。

function f(...[a, b, c]) {return a + b + c;
}f(1)          // NaN (b and c are undefined)
f(1, 2, 3)    // 6
f(1, 2, 3, 4) // 6 (the fourth parameter is not destructured)
剩余语法不仅仅用于函数参数

注意一点,剩余语法是一种语法,不仅仅只用作于函数参数。也可以用作收集数组解构时剩余的元素。

const [a, ...args] = [1, 2, 3, 4];
console.log(a); // 1
console.log(args); // [2, 3, 4]

相关文章:

展开语法、剩余语法

展开语法定义 展开语法Spread Syntax,可以在函数调用/数组构造时,将数组表达式或者string在语法层面展开;还可以在构造字面量对象时,将对象表达式按照key-value的方式展开。(字面量一般指[1, 2, 3]或者{name:"md…...

MongoDB归并连续号段-(待验证)

实现按照不同条件归并连续号段的方式与具体的数据模型和查询需求有关,以下是一种常见的方式: 假设有一个文档集合,包含如下字段: {"_id": ObjectId("613c3050d5d9b45a0de7c290"),"group": "…...

【每日一题】设计循环队列(C语言)

循环队列是我们可以对队列有更深一步的理解的题目,而且可以进一步加强其他方面的知识(例如对循环数组的取模运算,指针的解引用),是个蛮不错的巩固习题,话不多说,进入正题。 链接在此&#xff1…...

logic-flow 使用过程中遇到的bug - 拖动节点到画布的时候,鼠标松开,节点不落在画布,仍旧跟着鼠标走

背景: 插件:logicFlow 用途:画流程图 bug表现: 初始化的样子: bug的样子: 拖动第一个节点的时候,一切正常(无论哪个节点作为第一个节点,都是正常的,但是拖动…...

el-tree结合el-switch实现状态切换

<template><div><el-col :span"24"><el-card class"tree-card"><div class"sketch_content selectFile"><span class"span_title">组织列表 </span><div style"display: flex; jus…...

汽车智能座舱/智能驾驶SOC -1

看到华为&小康的 AITO问界M6、M7各种广告营销、宣传、测评、好评如潮水般席卷网络各APP平台。翻看了中信和海通对特斯拉M3和比亚迪元的拆解报告&#xff0c;也好奇华为的汽车芯片平台又能做出哪些新花样&#xff0c;下面是Mark开头&#xff0c;也学习下智能座舱和智能驾驶芯…...

2023 年爆肝将近 20 万字讲解最新 JavaEE 全栈工程师基础教程(更新中)

1. Java 语言基本概述 Java 是一种广泛使用的编程语言&#xff0c;由 James Gosling 在 Sun Microsystems&#xff08;现在是 Oracle Corporation 的一部分&#xff09;于 1995 年发表。Java 是一种静态类型的、类基础的、并发性的、面向对象的编程语言。Java 广泛应用于企业级…...

目标检测YOLO实战应用案例100讲-基于改进YOLOv5s的道路目标检测(续)

目录 3.3融合注意力模块 3.3.1注意力机制 3.3.2 SENet 3.3.3 CBAM 3.3.4ECA 3.3.5改进后的算法网络结构...

Laravel/Lumen 任务调度简易入门说明

前提 Laravel 中任务调度简化了服务器系统中 Cron 的操作&#xff0c;使得 计划任务 的实现更为简便。 这里主要以 Laravel 自带的消息队列进行说明&#xff0c;了解其间运行关系可以让我们更清晰的进行代码实现。 下方代码以 Lumen 9.x 框架进行举例&#xff0c;与 Laravel…...

目标检测 详解SSD原理,数据处理与复现

原理详解 前言 今天我们要读的这篇VGGNet&#xff08;《Very Deep Convolutional Networks For Large-Scale Image Recognition》&#xff09;&#xff0c;就是在AlexNet基础上对深度对网络性能的影响做了进一步的探索。它是ImageNet 2014年亚军&#xff0c;相比于AlexNet&am…...

智能座舱架构与芯片- (8) 视觉篇

一、概述 相比起用于ADAS感知系统的摄像头&#xff0c;用于智能座舱内部的摄像头&#xff0c;其功能特性和性能要求相对简单。例如&#xff0c;OMS乘客监控摄像头&#xff0c;一般达到5MP即可有良好的效果。同时&#xff0c;OMS也可应用于车内会议系统&#xff0c;还应用于车内…...

uniapp、微信小程序返回上页面刷新数据

目录 前言&#xff1a; 方法1&#xff1a; 方法2&#xff1a; 方法3&#xff1a; 前言&#xff1a; 返回上页面刷新数据这个功能主要用于在当前页面点击跳转到另一个页面之后&#xff0c;在另一个页面对数据进行了操作&#xff0c;比如&#xff1a;阅读量&#xff0c;然后返…...

axios 请求合集

post 请求 请求负载请求参数&#xff08;Request Payload&#xff09; import axios from axios import qs from query-stringexport function getRoles(data){return axios.post(目标地址,data,{headers:{Content-Type: application/json,},}) }表单请求参数&#xff08;Form…...

浪潮信息云峦服务器操作系统KeyarchOS体验与实践

写在前面 大家好我是网络豆&#xff0c;一名云计算运维人员&#xff0c;本文将会带大家体验一下浪潮信息服务器操作系统云峦KeyarchOS。看看浪潮信息服务器操作系统云峦KeyarchOS的优势与实践操作如何。 背景了解 KeyarchOS是浪潮信息基于Linux Kernel、OpenAnolis等开源技术…...

将 Spring 微服务与 BI 工具集成:最佳实践

软件开发领域是一个不断发展的领域&#xff0c;新的范式和技术不断涌现。其中&#xff0c;微服务架构和商业智能&#xff08;BI&#xff09;工具的采用是两项关键进步。随着 Spring Boot 和 Spring Cloud 在构建强大的微服务方面的普及&#xff0c;了解这些微服务如何与 BI 工具…...

负载均衡Ribbon和Feign的使用与区别

Ribbon 的介绍 Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。主要功能是提供客户端的软件负载均衡和服务调用。Ribbon 客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单的说&#xff0c;就是在配置文件中列出Load Balancer…...

Python Opencv实践 - 二维码和条形码识别

使用pyzbar模块来识别二维码和条形码。ZBar是一个开源软件&#xff0c;用来从图像中读取条形码&#xff0c;支持多种编码,比如EAN-13/UPC-A、UPC-E、EAN-8、代码128、代码39、交错2/5以及二维码。 pyzbar是python封装ZBar的模块&#xff0c;我们用它来做条形码和二维码的识别。…...

树莓派的的串口通信协议

首先&#xff0c;回顾一下串口的核心知识点&#xff0c;也是面试重点&#xff1a; 串口通信通常使用在多机通讯中串口通信是全双工的决定串口通信的成功与否的是 数据格式 和 波特率数据格式&#xff1a;1. 数据位 2.停止位 3. 奇偶校验位 树莓派恢复串口 回忆前几节树莓派刷机…...

DAY60 84.柱状图中最大的矩形

84.柱状图中最大的矩形 题目要求&#xff1a;给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 思路 单调栈 本地单调栈的解法和接雨水的题目是遥相呼…...

你知道Linux操作系统的前世今生吗?Linux系统又该如何搭建呢?

文章目录 前言1. Linux 是什么1.1 Unix & Linux 发展历程图1.2 Linux 的发展1.3 Linux 的发行版 2. Linux 环境搭建2.1 环境搭建方式2.2 使用云服务器 3. 使用终端软件连接到 Linux3.1 什么是终端软件3.2 下载安装 XShell3.3 使用 XShell 登陆主机 总结 前言 可能很多人都…...

别再傻傻分不清!医疗器械UDI码里的DI和PI,到底怎么用?

医疗器械UDI码实战指南&#xff1a;DI与PI的精准解析与应用 在医疗器械行业&#xff0c;UDI码就像产品的"身份证"&#xff0c;而其中的DI和PI则是这张身份证上最关键的信息区块。许多从业者虽然每天都在扫描这些条形码&#xff0c;却未必真正理解如何高效利用这两组数…...

SAP DB02里写原生SQL取数,比SE16N导表再合并Excel快多了!

SAP DB02原生SQL实战&#xff1a;告别Excel合并的高效取数方案 每次从SAP导出多张表格再用Excel做VLOOKUP时&#xff0c;你是否也经历过这样的崩溃时刻&#xff1f;数据量稍大Excel就卡死&#xff0c;关联字段拼写错误导致匹配失败&#xff0c;或是好不容易处理完发现漏了关键字…...

从零构建个性化AI智能体:基于开源框架的实践指南

1. 项目概述&#xff1a;从零构建一个个性化的智能体锻造工坊最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“openclaw-personalized-agent-forge”。光看名字&#xff0c;你可能会觉得这又是一个跟风大语言模型&#xff08;LLM&#xff09;的玩具项目。但作为一个在AI应…...

Chrome插件开发实战

目录 一、核心概念与基础 二、开发环境搭建 三、Content Script深度开发 四、Background Script高级技巧 五、数据存储方案选型 六、权限安全最佳实践 七、调试与性能优化 八、实战案例&#xff1a;广告拦截插件 九、发布与更新策略 掌握浏览器扩展开发核心技术&#…...

中文商业报告Markdown模板:提升效率与专业度的结构化写作框架

1. 项目概述&#xff1a;一份开箱即用的中文商业报告模板最近在整理团队季度复盘材料&#xff0c;发现一个挺普遍的问题&#xff1a;大家花在数据整理和格式调整上的时间&#xff0c;远比分析业务本身要多。一份商业报告&#xff0c;从数据清洗、图表制作到排版成文&#xff0c…...

开源监控代理ClawMonitor:轻量级系统监控与日志采集实战指南

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫openclawq/clawmonitor。乍一看这个名字&#xff0c;可能有点摸不着头脑&#xff0c;但如果你在运维或者开发领域&#xff0c;尤其是对系统监控、日志聚合、性能分析这些事头疼过&#xff0c;那这个项目很…...

2026年国产温度传感器十大厂家排名

在智能家居、工业物联网和智慧医疗全面铺开的2026年&#xff0c;温湿度传感器这个“环境感知小能手”变得无处不在。但市场上品牌众多&#xff0c;技术路线各异&#xff0c;到底该怎么选&#xff1f;本文摒弃简单的销量排名&#xff0c;从 核心技术、方案整合、场景深耕 三大维…...

基于静态分析与图数据库的代码知识图谱构建与应用实践

1. 项目概述&#xff1a;一个为代码库绘制知识图谱的开源工具 如果你和我一样&#xff0c;长期维护着几个规模不小的代码仓库&#xff0c;或者刚接手一个全新的、文档可能已经过时的遗留项目&#xff0c;那么你一定体会过那种面对数千个文件时的茫然感。代码之间的调用关系、模…...

星露谷物语模组开发终极指南:SMAPI完整使用教程

星露谷物语模组开发终极指南&#xff1a;SMAPI完整使用教程 【免费下载链接】SMAPI The modding API for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/smap/SMAPI SMAPI&#xff08;Stardew Valley Modding API&#xff09;是星露谷物语模组生态的核心引…...

终极植物大战僵尸辅助工具:如何免费解锁游戏隐藏功能

终极植物大战僵尸辅助工具&#xff1a;如何免费解锁游戏隐藏功能 【免费下载链接】pvztools 植物大战僵尸原版 1.0.0.1051 修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztools 植物大战僵尸辅助工具PvZ Tools是一款专为经典游戏《植物大战僵尸》1.0.0.1051版…...