ES新增的运算符:**、**=、?.、??、||=、&&=、??=

一、****=指数运算符

ES2016新增指数运算符**,

2 ** 2        // 4
2 ** 4        // 16

而且多个字数运算符一起应用时,是从右边开始计算的。

2 ** 3 ** 2    //等同于2 ** (3 ** 2),2的9次方
//512

指数运算符和等号结合,可以形成一个新的运算符**=。

let a = 3;
a **= 3    //27,等价于a = a * a * a; 

二、?.链判断运算符

ES2020 引入了链判断符?.,用于判断前方的属性是否有值。

若是没有值,可以赋默认值。

const firstName = message?.body?.user?.firstName || 'default';

上面代码使用了?.运算符,直接在链式调用的时候判断,左侧的对象是否为nullundefined。如果是的,就不再往下运算,而是返回undefined,从而给firstName赋上默认值'default'。

链判断运算符?.有三种写法。

  • obj?.prop // 对象属性是否存在
  • obj?.[expr]  // 同上
  • func?.(...args) // 函数或对象方法是否存在

使用注意事项:

1、短路机制

本质上,?.运算符相当于一种短路机制,只要不满足条件,就不再往下执行。

a?.[++x]
// 等同于 a == null || a == undefined ? undefined : a[++x]

上述代码中,如果a为undefinednull,那么x不会进行递增运算。也就是说,链判断运算符一旦为真,右侧的表达式就不再求值。

2、括号的影响

如果属性链有圆括号,链判断运算符对圆括号外部没有影响,只对圆括号内部有影响。

(a?.b).c
// 等价于 (a == null ? undefined : a.b).c

由于?.对圆括号外部没有影响,不管a对象是否存在,圆括号后面的.c总是会执行。所以一般来说,使用?.运算符的场合,不应该使用圆括号。

3、报错场合

// 构造函数
new a?.()
new a?.b()

// 链判断运算符的右侧有模板字符串
a?.`{b}`
a?.b`{c}`

// 链判断运算符的左侧是 super
super?.()
super?.foo

// 链运算符用于赋值运算符左侧
a?.b = c

以上全都为错误用法,会报错。

4、右侧不得为十进制数值

为了保证兼容以前的代码,允许foo?.3:0被解析成foo ? .3 : 0  (foo ? 0.3 : 0),因此规定如果?.后面紧跟一个十进制数字,那么?.不再被看成是一个完整的运算符,而是会按照三元运算符进行处理,也就是说,那个小数点会归属于后面的十进制数字,形成一个小数(如上例为0.3)。

三、?? 空判断运算符

在之前,为属性指定默认值通常使用 || ,但使用 || 会存在=>当左侧属性值为空字符串或false或0,默认值也会生效的问题。

于是ES2020 引入了一个新的 Null 判断运算符??。它的行为类似 || ,但是只有运算符左侧的值为null或undefined时,才会返回右侧的值。如下例子,左边为null或undefined时,赋值'Hello, world!'。

const headerText = response.settings.headerText ?? 'Hello, world!';

可以与链判断运算符?.配合使用,为null或undefined的值设置默认值。

const animation = res.settings?.animation ?? 300;

使用注意事项:

??本质上是逻辑运算,它与其他两个逻辑运算符&&和||有一个优先级问题。所以如果多个逻辑运算符一起使用,必须用括号表明优先级,否则会报错。

// 报错
lhs && middle ?? rhs
lhs ?? middle && rhs
lhs || middle ?? rhs
lhs ?? middle || rhs

// 正确写法
(lhs && middle) ?? rhs;
lhs && (middle ?? rhs);

四、||=、&&=、??=逻辑赋值运算符

ES2021引入了三个新的逻辑赋值运算符,将逻辑运算符与赋值运算符进行结合。

// 或赋值运算符
x ||= y
// 等同于
x || (x = y)

// 与赋值运算符
x &&= y
// 等同于
x && (x = y)

// Null 赋值运算符
x ??= y
// 等同于
x ?? (x = y)

这三个运算符||=&&=??=相当于先进行逻辑运算,然后根据运算结果,再视情况进行赋值运算。因为先进行逻辑运算,所以会是短路算法。

它们的一个用途是,为变量或属性设置默认值。

// 老的写法
user.id = user.id || 1;

function example(opts) {
  opts.foo = opts.foo ?? 'bar';
  opts.baz ?? (opts.baz = 'qux');
}


// 新的写法
user.id ||= 1;

function example(opts) {
  opts.foo ??= 'bar';
  opts.baz ??= 'qux';
}

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 作为 CSDN 开发的 AI 语言模型,我可以告诉您,ES2023 新增的特性包括:1. Promise.any() 方法;2. WeakRefs 弱引用;3. 数字分隔符;4. String.prototype.replaceAll() 方法;5. Logical Assignment Operators 逻辑赋值运算符;6. Numeric Separators 数字分隔符。以上是我对您问题的回答,希望能够帮到您。 ### 回答2: ES2023是指ECMAScript的下一版标准,它的新增特性有以下几个方面: 1. 数值分隔符(Numeric Separators):ES2023将新增一个下划线(_)作为数值分隔符,以提高数字的可读性和编写代码时的易读性。例如,可以使用数字分隔符将一个大数字分隔成更易读的部分。 2. Promise.any()方法:ES2023将引入Promise.any()方法,该方法返回一个Promise,一旦其中任何一个传入的Promise变为resolve状态,该方法就会立即resolve。这个特性可以用于处理多个异步操作,只要有一个成功即可,无需等待其他。 3. 数值类型千分位分隔符(Intl.NumberFormat):ES2023将提供Intl.NumberFormat构造函数的新特性,使得开发者能够使用千位分隔符来格式化和解析数字。这在国际化开发中特别有用。 4. 字符串用于限制属性名称(Symbol-based Property Restrictions):ES2023将引入Symbol-based Property Restrictions来限制属性名称的值必须为Symbol类型。这样可以避免在使用对象属性时不小心使用了字符串。 5. SharedArrayBuffer 和 Atomics增强:ES2023将对SharedArrayBuffer和Atomics进行一些增强,以提高多线程和并发操作的性能和安全性。 以上就是ES2023新增的一些特性,通过这些特性的引入,可以提高JavaScript开发的效率和代码质量,同时也为多线程和国际化开发提供了更好的支持。 ### 回答3: ES2023是JavaScript的下一个版本,虽然它尚未正式发布,但已经可以预测一些可能的新增特性。以下是可能包含在ES2023中的一些特性: 1. Shared memory and atomics: ES2023可能会引入共享内存和原子操作,这将允许多个线程之间共享数据,并能够以原子方式访问和修改共享数据。 2. Optional chaining: 该特性已经在ES2020中引入。它允许开发者使用?.语法来简化对对象属性或方法的安全访问,避免了因为遇到空值或未定义的情况而导致的错误。 3. Pipeline operator: 管道运算符是一种用于简化函数式编程的语法。它允许通过简洁流畅的方式将函数应用于一系列数据。这个特性在ES2022被正式接受,并且可能进一步改进和扩展。 4. Record and Tuple types: 这两种类型已经被TC39委员会接受为Stage 2特性,并有望在ES2023中正式成为一部分。Record类型允许定义具有固定属性集的对象,而Tuple类型允许定义具有固定长度的数组。 5. Ergonomic brand checks: 这个特性的目标是为了提高类型安全性,同时保持语法的简洁和易读。它将提供一种在编译时对对象进行类型判断的方法,以便在运行时避免错误。 请注意,以上列出的特性只是一些可能会出现在ES2023中的特性,具体实施和变化还有待官方发布和确认。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值