指数运算符 **

console.log(2 ** 2 ) //4
console.log(2 ** 3 ) //8
console.log(2 ** 4) //16

链判断运算符的诞生(?.)

在实际编程中,
如果读取对象内部的某个属性,往往需要判断一下。
属性的上层对象是否存在。比如,读取 message.body.user.firstName这个属性,安全的写法是写成下面这样。 let message={
body:{
user:{
firstName:''
}
}
} // 错误的写法;因为这message.body这个值可能没有,会导致报错
const firstName = message.body.user.firstName || 'default'; // 正确的写法
const firstName = (message
&& message.body
&& message.body.user
&& message.body.user.firstName) || 'default';
有的小伙伴可能会觉得这样会很麻烦,怎么会处理这个问题了。 //使用链式运算符
let myDefault= message?.body?.user?.firstName || '默认值';
/**
* 上面代码中,如果message是null或undefined,
* 或者message.body是null或undefined,
* 或者message.body.user是null或undefined,
* 或者message.body.user.firstName是null或undefined.
* 就会返回--默认值。
* */

链判断运算符(?.)的详细讲解

?.运算符,直接在链式调用的时候判断。
左侧的对象是否为null或undefined。
如果是的,就不再往下运算,而是返回undefined
本质上,?.运算符相当于一种短路机制,只要不满足条件,就不再往下执行。

链判断运算符-判断对象是否有某个方法

let message={
// say:function(){
// console.log('hello word')
// }
}
//如果没有该方法,则不会被执行的哈
message.say?.()
它表达的意思是: message.say如果有定义,就会调用该方法。
否则message.say直接返回undefined,不再执行?.后面的部分。

Null 判断运算符 ( ?? )

读取对象属性的时候,如果某个属性的值是null或undefined,
有时候需要为它们指定默认值。常见做法是通过||运算符指定默认值。
const headerText = response.settings || 'Hello, world!';
const animationDuration = response.settings || 300;
但是我们开发者的意愿是:
只要属性的值为null或undefined,默认值就会生效,
但是实际属性的值如果为空字符串或false或0,默认值也会生效。(与我们的初衷相违背) 为了避免这种情况,ES2020 引入了一个新的 Null 判断运算符??。
**它的行为类似||,但是只有运算符左侧的值为null或undefined时,才会返回右侧的值。** const headerText = response.settings ?? 'Hello, world!';
const animationDuration = response.settings ?? 300;
上面代码中,默认值只有在左侧属性值为null或undefined时,才会生效。

这一行代码包括了两级属性的判断。

const animationDuration = response.settings?. animationDuration ?? 300;
上面代码中,
如果response.settings是null或undefined,
或者response.settings.animationDuration是null或undefined,
就会返回默认值300。
也就是说,这一行代码包括了两级属性的判断。

现在的规则是,如果多个逻辑运算符一起使用,必须用括号表明优先级,否则会报错。

// 报错
lhs && middle ?? rhs
lhs ?? middle && rhs
lhs || middle ?? rhs
lhs ?? middle || rhs
上面四个表达式都会报错,必须加入表明优先级的括号。 (lhs && middle) ?? rhs; ok
lhs && (middle ?? rhs); ok (lhs ?? middle) && rhs; ok
lhs ?? (middle && rhs); ok (lhs || middle) ?? rhs; ok
lhs || (middle ?? rhs); ok (lhs ?? middle) || rhs; ok
lhs ?? (middle || rhs); ok

es6新增的运算符-链判断运算符的诞生[?.]和null的判断运算符??的更多相关文章

  1. ES6 新增的一些特性

    还有symbol和set,map, bind,call,apply 1. let关键字 (1)基本用法:let关键字用来声明变量,它的用法类似于var,都是用来声明变量. (2)块级作用域:let声明 ...

  2. 浅谈ES6新增数据类型:Symbol

    面试中喜闻乐见的问题就是问我们的ES6新增了哪些个新特性 这篇文章一起学习一下新增的数据类型:Symbol JS的原始数据类型:6种Boolean,String,Undefined,NULL,Numb ...

  3. es6新增功能

    声明命令 1. let命令 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效.下面代码在代码块之中,分别用let和var声明了两个变量.然 ...

  4. ES6新增特性

    ES6:  ECMA 第六次改版   块级作用域:   凡是被{ }包裹住的代码都是块级作用域,除了对象       特点:会造成一个暂时性死区    新增声明变量的两种方式: let:     a. ...

  5. ES6新增语法和内置对象(let,const, Array/String/Set 扩展方法(解构赋值,箭头函数,剩余参数))

    1.let ES6中新增的用于声明变量的关键字. let 声明的变量只在所处于的块级有效. 注意:使用 let 关键字声明的变量才具有块级作用域,var 关键字是不具备这个特点的. 1. 防止循环变量 ...

  6. 面向对象编程-终结篇 es6新增语法

    各位,各位,终于把js完成了一个段落了,这次的章节一过我还没确定下面要学的内容可能是vue也可能是前后端交互,但无论是哪个都挺兴奋的,因为面临着终于可以做点看得过去的大点的案例项目了,先憋住激动地情绪 ...

  7. ES6新增的常用数组方法(forEach,map,filter,every,some)

    ES6新增的常用数组方法 let arr = [1, 2, 3, 2, 1]; 一 forEach => 遍历数组 arr.forEach((v, i) => { console.log( ...

  8. ES6新增的数据类型Map和Set。

    Javascript的默认对象表示方式 {} ,即一组键值对. 但是Javascript的对象有个小问题,就是键必须是字符串.但实际上Number或者其他数据类型作为键也是非常合理的. 为了解决这个问 ...

  9. ES6 新增的一些东西

    一.常量 不允许重复定义 const a='HELLO' const a='world'//报错Uncaught SyntaxError: Identifier 'a' has already bee ...

  10. ES6新增的math,Number方法

    ES6新增的math,Number方法,下面总结了一些我觉得有用的 Nunber.isInteger()判断是否为整数,需要注意的是1,和1.0都会被认为是整数 console.log(Number. ...

随机推荐

  1. 代码混淆工具ipaguard:如何使用ipaguard保护和混淆iOS应用程序代码

    ​ 转载:怎么保护苹果手机移动应用程序ios ipa文件中的代码? 目录 转载:怎么保护苹果手机移动应用程序ios ipa文件中的代码? 代码混淆步骤 1. 选择要混淆保护的ipa文件 2. 选择要混 ...

  2. 在探索的道路上持续“做对”,火山引擎A/B测试成为这家企业数字基建

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群   最近,乐刻的"百城万店"战略在行业激起了许多讨论.在传统健身馆经营承压.服务业难标准化的语 ...

  3. 注册中心/配置管理 —— SpringCloud Alibaba Nacos

    Nacos 简介 Nacos 是一个易于使用的动态服务发现.配置和服务管理平台,用于构建云原生的应用程序 Nacos 的关键特性包括以下几项: 服务发现和服务健康监测:服务提供者使用原生 SDK.Op ...

  4. Mysql--binlog日志

    一.简介 binlog日志也称二进制日志,记录了所有的DDL和DML( 除了数据查询语句 )语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. 一般来说开启二进 ...

  5. JSP开发模式(四种模式)

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 学习编程开发少不了学习开发模式, JSP在创立至今有 \(4\) 种流行的开发模式: 包括 JS ...

  6. 区间DP练习题题解

    算法讲解:Here AcWing 282. 石子合并 (模板) 题目链接:Here const int N = 310; int a[N], s[N]; int dp[N][N]; void solv ...

  7. U64949 棋盘覆盖(二分图)| 二分图匹配总结

    https://ac.nowcoder.com/acm/contest/1062/B [题目] 给出一张n×n(n≤100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩盖 ...

  8. 【Serverless实战】传统单节点网站的Serverles

    什么是函数?刚刚考完数学没多久的我,脑里立马想到的是自变量.因变量.函数值,也就是y=f(x).当然,在计算机里,函数function往往指的是一段被定义好的代码程序,我们可以通过传参调用这个定义好的 ...

  9. 真实感渲染:WebGPU介绍和使用光栅化管线绘制一个三角形

    大家好~本课程为"真实感渲染"的线上课程,从0开始,介绍相关的图形学算法和数学基础,给出详细的数学推导.伪代码和实现代码,最终带领大家开发出基于物理的渲染器 线上课程资料: 本节课 ...

  10. Element-ui 之 form表单套数组、表单数组套数组的校验rules

    https://blog.csdn.net/qq_61553794/article/details/135451461