ES6新增运算符

news2024/11/25 4:52:42

?. 可选链运算符
一个对象的属性,如果这个属性是对象,它还有子属性,访问这个子属性,比如

var obj = {a: {key: 'val'}}
console.log(obj.a.key) // val

如果属性不存在的时候,则有可能会报错。

var obj = {key: 'val'}
console.log(obj.a.key) // error: Cannot read properties of undefined (reading 'key')

如果要兼容这个情况,需要加上默认值兼容

var obj = {key: 'val'}
console.log((obj.a || {}).key) // undefined

如果层级过深,就不好阅读。

(((obj.a || {}).b || {}).c || {}).d
// 或者
obj.a && obj.a.b && obj.a.b.c && obj.a.b.c.d

可选链运算符就是用来改善这种写法。 它使用?.表示。
上面的例子可以用可选链运算符来改写

obj.a?.key
obj.a?.b?.c?.d

效果是一样的,是不是可读性增加,也节省了代码?
如果发现没有该属性的时候,则不会进行后面的点运算。
它也可以写在函数执行的时候。兼容该函数可能不是函数的情况。这种情况需要该函数名先定义好或者有值,不然还是会报错。

var fn
fn?.() // 不会报错
fn1?.() // 报错

可选链不能用在super关键字上,模版字符串,实例化构造函数, 赋值运算符的左侧等。

super?.fn() // error
new Fn?.a() // error
obj.a?.`${b}` // error
obj?.a = obj

** 指数运算符
以前我们算幂次方是这样算的

Math.pow(2,3) // 8

现在可以通过指数运算符来计算, 用**表示

2 ** 3 // 8

也可以连写

2** 3 ** 3 // 134217728

可能你会疑惑,为什么这么大,因为它是从右边计算的。 等同于2**(3 ** 3)。


?? 空值合并运算符(也称Null判断运算符)
只有当 ?? 左侧的值是undefined或者null才会执行默认值。

var a = '' ?? 'default'
console.log(a) // ''
var a = 0 ?? 'default'
console.log(a) // 0
var a = 123 ?? 'default'
console.log(a) // 123
var a = undefined ?? 'default'
console.log(a) // default
var a = undefined ?? 'default'
console.log(a) // default

如果和&&或者||混用的时候,需要加上()显示表明优先级,不然会报错。

var a = undefined ?? 'default' && 'a' // error
var a = (undefined ?? 'default') && 'a' // 'a'

逻辑赋值运算符
有三种逻辑赋值运算符:

  • 逻辑并赋值运算符(&&=)
  • 逻辑或赋值运算符(||=)
  • 空值合并赋值运算符(??=)

主要是对本身进行逻辑操作后,然后对它赋值后面的值。

var a,b,c
a &&= 1 // undefined
//等同于
a && (a = 1)
b ||= 1 // 1
//等同于
b || (b = 1)
c ??= 1 // 1
//等同于
c ?? (c = 1)

… 扩展操作符

// spread operator doing the concat job
let arr = [1, 2, 3];
let arr2 = [4, 5];
  
arr = [...arr, ...arr2];
console.log(arr); // [ 1, 2, 3, 4, 5 ]

1. 拷贝数组对象
使用扩展符拷贝数组是ES6中常用的操作:

const years = [2018, 2019, 2020, 2021];
const copyYears = [...years];
console.log(copyYears); // [ 2018, 2019, 2020, 2021 ]

扩展运算符拷贝数组,只有第一层是深拷贝,即对一维数组使用扩展运算符拷贝就属于深拷贝,看下面的代码:

const miniCalendar = [2021, [1, 2, 3, 4, 5, 6, 7], 1];
const copyArray = [...miniCalendar];
console.log(copyArray); // [ 2021, [ 1, 2, 3, 4, 5, 6, 7 ], 1 ]
copyArray[1][0] = 0;
copyArray[1].push(8);
copyArray[2] = 2;
console.log(copyArray); // [ 2021, [ 0, 2, 3, 4, 5, 6, 7, 8 ], 2 ]
console.log(miniCalendar); // [ 2021, [ 0, 2, 3, 4, 5, 6, 7, 8 ], 1 ]

把打印的结果放在一起便于更加清楚进行对比,如下:

变量说明

结果

操作

copyArray

[ 2021, [ 1, 2, 3, 4, 5, 6, 7 ], 1 ]

复制数组 miniCalendar

copyArray

[ 2021, [ 0, 2, 3, 4, 5, 6, 7, 8 ], 2 ]

1. 将数组第二个元素的第一个元素重新赋值为 0 ;2. 往数组的第二个元素增加一个元素 8 ;3. 将数组第三个元素重新赋值为2

miniCalendar

[ 2021, [ 0, 2, 3, 4, 5, 6, 7, 8 ], 1 ]

从结果来看,数组的第二个元素为数组,大于1维了,里面的元素的变更将导致原变量的值随之改变

拷贝对象,代码如下:

const time = {
  year: 2021,
  month: 7,
  day: {
    value: 1,
  },
};
const copyTime = { ...time };
console.log(copyTime); // { year: 2021, month: 7, day: { value: 1 } }

扩展运算符拷贝对象只会在一层进行深拷贝,从下面代码是基于上面代码:

copyTime.day.value = 2;
copyTime.month = 6;
console.log(copyTime); // { year: 2021, month: 6, day: { value: 2 } }
console.log(time); // { year: 2021, month: 7, day: { value: 2 } }

从打印的结果看,扩展运算符只对对象第一层进行了深拷贝。
严格来讲,扩展运算符不执行深拷贝


2. 合并操作
先来看数组的合并,如下:

const halfMonths1 = [1, 2, 3, 4, 5, 6];
const halfMonths2 = [7, 8, 9, 10, 11, 12];
const allMonths = [...halfMonths1, ...halfMonths2];
console.log(allMonths); // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]

合并对象,在合并对象时,如果一个键已经存在,它会被具有相同键的最后一个对象给替换。

const time1 = {
  month: 7,
  day: {
    value: 1,
  },
};
const time2 = {
  year: 2021,
  month: 8,
  day: {
    value: 10,
  },
};
const time = { ...time1, ...time2 };
console.log(time); // { month: 8, day: { value: 10 }, year: 2021 }

3. 参数传递

const sum = (num1, num2) => num1 + num2;
console.log(sum(...[6, 7])); // 13
console.log(sum(...[6, 7, 8])); // 13

从上面的代码看,函数定义了多少个参数,扩展运算符传入的值就是多少个。
和 math 函数一起使用,如下:

const arrayNumbers = [1, 5, 9, 3, 5, 7, 10];
const min = Math.min(...arrayNumbers);
const max = Math.max(...arrayNumbers);
console.log(min); // 1
console.log(max); // 10

4. 数组去重
与 Set 一起使用消除数组的重复项,如下:

const arrayNumbers = [1, 5, 9, 3, 5, 7, 10, 4, 5, 2, 5];
const newNumbers = [...new Set(arrayNumbers)];
console.log(newNumbers); // [ 1,  5, 9, 3, 7, 10, 4, 2 ]

5. 字符串转字符数组
String 也是一个可迭代对象,所以也可以使用扩展运算符 ... 将其转为字符数组,如下:

const title = "china";
const charts = [...title];
console.log(charts); // [ 'c', 'h', 'i', 'n', 'a' ]

进而可以简单进行字符串截取,如下:

const title = "china";
const short = [...title];
short.length = 2;
console.log(short.join("")); // ch

6. NodeList 转数组
NodeList 对象是节点的集合,通常是由属性,如 Node.childNodes 和方法,如 document.querySelectorAll 返回的。
NodeList 类似于数组,但不是数组,没有 Array 的所有方法,例如find、map、filter 等,但是可以使用 forEach() 来迭代。
可以通过扩展运算符将其转为数组,如下:

const nodeList = document.querySelectorAll(".row");
const nodeArray = [...nodeList];
console.log(nodeList);
console.log(nodeArray);

7. 解构变量
解构数组,如下:
 

const [currentMonth, ...others] = [7, 8, 9, 10, 11, 12];
console.log(currentMonth); // 7
console.log(others); // [ 8, 9, 10, 11, 12 ]

解构对象,如下:

const userInfo = { name: "Crayon", province: "Guangdong", city: "Shenzhen" };
const { name, ...location } = userInfo;
console.log(name); // Crayon
console.log(location); // { province: 'Guangdong', city: 'Shenzhen' }

8. 打印日志
在打印可迭代对象的时候,需要打印每一项可以使用扩展符,如下:

const years = [2018, 2019, 2020, 2021];
console.log(...years); // 2018 2019 2020 2021

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/770755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

预处理详解(一)---预定义符号

文章目录 预定义符号预定义符号的使用 预定义符号 在C语言中,有一些有意思的预定义符号,这些预定义符号都是语言内置的,即以及定义好的,我们可以直接使用。预定义符号主要有以下几个: __FILE__ //进行编译的源…

Windows安装激活注意事项

选择语言、版本(Windows 10指的是专业版本)和体系结构(32位/64位),这里自行根据情况选择(如果机器预装的是Windows 10家庭中文版则选择家庭中文版,如果预装的是专业版则选择Windows 10。这样原先…

vue(html,css,vue2,vue3) 学习总结

文章目录 小白 Vue 3 学习一些名词软件安装 VSCode 中的一些设置1. 关闭eslint检查tsconfig.json 配置文件2. ts 文件引用报红 相对路径写法常见图片格式和区别目录结构JS/TS1. prototype(原型对象)2. 导入/导出3. 去除字符串两端空格4. 一些特殊语法糖5. 深拷贝6. 拼接两个数组…

openGauss学习笔记-14 openGauss 简单数据管理-查看对象

文章目录 openGauss学习笔记-14 openGauss 简单数据管理-查看对象14.1 查看命令帮助信息14.2 切换数据库14.3 查询所有数据库14.4 查询当前数据库中的所有表14.5 查看表结构 openGauss学习笔记-14 openGauss 简单数据管理-查看对象 gsql工具提供了若干高级特性,便于…

Linux 漏洞扫描

Linux 漏洞扫描程序会仔细检查基于 Linux 的系统,以减轻潜在的风险和漏洞。 什么是 Linux 漏洞扫描程序 Linux 漏洞扫描程序是一种专门的漏洞扫描工具,旨在识别基于 Linux 的系统中的安全漏洞和弱点,它会扫描配置错误、过时的软件版本和已知漏洞。 为…

UG\NX二次开发 捕获NX OPEN C++异常,乱码问题

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 捕获NX OPEN C++异常,乱码问题。 效果: 使用uc1601(ex.what(),1)显示乱码 使用 NXMessageBox()->Show("Block Styler", NXMessageBox::DialogTypeError, ex…

Selenium(3 + 4 超级详细笔记)

文章目录 selenium(web自动化测试)1. selenium初始化(2种)2. chrome 启动参数(3种)3. 八大定位方式3.1 css 定位3.2 xpath 定位3.3 link_text 定位3.4 partial_link_text 定位3.5 relative 相对定位 4. 添加…

uniapp动态获取列表中每个下标的高度赋值给另一个数组(完整代码附效果图)

uniapp实现动态获取列表中每个下标的高度&#xff0c;赋值给另一个数组。 先看效果图&#xff1a; 完整代码&#xff1a; <template><div class""><div class"">我是A列表&#xff0c;我的高度不是固定的</div><div class&qu…

DDOS百科:什么是 DDoS 攻击及如何防护DDOS攻击

一、什么是 DDoS 攻击&#xff1f; 当多台机器一起攻击一个目标&#xff0c;通过大量互联网流量淹没目标或其周围基础设施&#xff0c;从而破坏目标服务器、服务或网络的正常流量时&#xff0c;就会发生分布式拒绝服务(DDoS)攻击。 DDoS允许向目标发送指数级更多的请求&#…

Revit 导出明细表的两种方法!

方法一、Revit中怎么灵活运用明细表格式的导出与导入 在做项目的时候&#xff0c;遇到一些项目需要进行工程量统计的时候&#xff0c;经常需要设置明细表里面的格式&#xff0c;例如字体、表格排布样式等&#xff0c;但是项目一旦多起来&#xff0c;这些工作重复性又太高&#…

云计算和云架构是什么 有什么用途?

云计算是一种基于互联网的计算方式&#xff0c;它通过网络将计算资源(如计算能力、存储、网络带宽等)以服务的形式提供给用户&#xff0c;并允许用户根据需求进行灵活的资源调配和管理。云计算通常分为三个层次&#xff0c;即基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服…

如何快速爬取国内985大学学术学报pdf文件

背景 最近&#xff0c;在爬取关于国内985大学的学报时&#xff0c;我注意到大部分大学学报站点格式都采用相似的形式&#xff0c;并且PDF链接都使用自增的ID。然而&#xff0c;我也发现了一个问题&#xff0c;即大多数PDF链接的ID并不是连续的。现在我将向你分享一些方法&…

图采样、随机游走、subgraph的实现

诸神缄默不语-个人CSDN博文目录 本博文主要关注如何用代码实现图采样、随机游走、subgraph&#xff08;为什么这些东西放在一起写&#xff0c;我感觉还蛮直觉的&#xff09;。 随机游走和subgraph我之前都写过不少博文了&#xff0c;可以参考↑ 这个主要是我前年还在干GNN时候…

AtcoderABC247场

A - Move RightA - Move Right 题目大意 要求判断在一行4个方块上的人进行向右移动后&#xff0c;是否每个方块上都有人。初始状态下&#xff0c;给定一个由0和1组成的长度为4的字符串S&#xff0c;其中1表示对应方块上有人&#xff0c;0表示没有人。每个人同时向右移动一格&a…

Java控制台+activiti+springboot+mybatis实现账务报销工作流程

Java控制台activitispringbootmybatis实现账务报销工作流程 一、系统介绍二、功能展示1.代码展示2.员工报销3.账务审批4.总经理审批 三、代码展示四、获取源码 一、系统介绍 系统主要功能&#xff1a; 员工&#xff1a;填写报销单 账务审批&#xff1a;报销金额小于1000账务经…

智能电表数据采集器

智能电表数据采集器是一种用于采集智能电表数据的设备&#xff0c;它可以将智能电表的数据传输到远程服务器上&#xff0c;以便进行数据分析和监控。智能电表数据采集器的主要功能是采集智能电表的实时数据&#xff0c;并将其发送到远程服务器上&#xff0c;从而实现对智能电表…

能源监测系统:实时监控+数据可视化

能源监测系统是应用物联网技术&#xff0c;对水、电、气、热等能源进行实时监测的系统&#xff0c;能够对各种设备数据进行智能化标准化的管理&#xff0c;从而建立起统一的管理优化平台&#xff0c;是积极响应国家节能降耗政策的典型模范&#xff0c;也是企业建设节能型工厂的…

【C++】-stack和queue的具体使用以及模拟实现(dqeue的介绍+容器适配器的介绍)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

MySQL第六章、JDBC编程

目录 一、数据库编程的必备条件 二、Java的数据库编程&#xff1a;JDBC 三、JDBC工作原理 四、JDBC使用 4.1JDBC开发案例 一、数据库编程的必备条件 编程语言&#xff0c;如Java&#xff0c;C、C、Python等数据库&#xff0c;如Oracle&#xff0c;MySQL&#xff0c;SQL S…

uniapp 正常显示editor富文本编辑器的内容

如果不添加editor的样式文件&#xff0c;空格、图片都会显示不正常&#xff0c;需要按照官方文档提示&#xff0c;第一添加样式&#xff0c;第二&#xff0c;设置对应的显示方式。 一、下载editor样式 二、我使用的是rich-text组件&#xff0c;来显示html字符串 <template&…