es6新增的运算符-链判断运算符的诞生[?.]和null的判断运算符??
指数运算符 **
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的判断运算符??的更多相关文章
- ES6 新增的一些特性
还有symbol和set,map, bind,call,apply 1. let关键字 (1)基本用法:let关键字用来声明变量,它的用法类似于var,都是用来声明变量. (2)块级作用域:let声明 ...
- 浅谈ES6新增数据类型:Symbol
面试中喜闻乐见的问题就是问我们的ES6新增了哪些个新特性 这篇文章一起学习一下新增的数据类型:Symbol JS的原始数据类型:6种Boolean,String,Undefined,NULL,Numb ...
- es6新增功能
声明命令 1. let命令 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效.下面代码在代码块之中,分别用let和var声明了两个变量.然 ...
- ES6新增特性
ES6: ECMA 第六次改版 块级作用域: 凡是被{ }包裹住的代码都是块级作用域,除了对象 特点:会造成一个暂时性死区 新增声明变量的两种方式: let: a. ...
- ES6新增语法和内置对象(let,const, Array/String/Set 扩展方法(解构赋值,箭头函数,剩余参数))
1.let ES6中新增的用于声明变量的关键字. let 声明的变量只在所处于的块级有效. 注意:使用 let 关键字声明的变量才具有块级作用域,var 关键字是不具备这个特点的. 1. 防止循环变量 ...
- 面向对象编程-终结篇 es6新增语法
各位,各位,终于把js完成了一个段落了,这次的章节一过我还没确定下面要学的内容可能是vue也可能是前后端交互,但无论是哪个都挺兴奋的,因为面临着终于可以做点看得过去的大点的案例项目了,先憋住激动地情绪 ...
- ES6新增的常用数组方法(forEach,map,filter,every,some)
ES6新增的常用数组方法 let arr = [1, 2, 3, 2, 1]; 一 forEach => 遍历数组 arr.forEach((v, i) => { console.log( ...
- ES6新增的数据类型Map和Set。
Javascript的默认对象表示方式 {} ,即一组键值对. 但是Javascript的对象有个小问题,就是键必须是字符串.但实际上Number或者其他数据类型作为键也是非常合理的. 为了解决这个问 ...
- ES6 新增的一些东西
一.常量 不允许重复定义 const a='HELLO' const a='world'//报错Uncaught SyntaxError: Identifier 'a' has already bee ...
- ES6新增的math,Number方法
ES6新增的math,Number方法,下面总结了一些我觉得有用的 Nunber.isInteger()判断是否为整数,需要注意的是1,和1.0都会被认为是整数 console.log(Number. ...
随机推荐
- 每条你收藏的资讯背后,都离不开TA
摘要:云原生数据库GaussDB(for Redis)不仅提升了阅客的服务效率,让个性化推荐更快更稳,还降低了存储和改造成本,为企业未来发展奠定了云化基础,助力阅客实现更高质量的资讯触达. 随着互联网 ...
- xcode打包导出ipa
xcode打包导出ipa 众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果IPA,作为刚接触ios开发的同学,只是学习ios app开发内测,并没有上架appstore需求,对于苹果 ...
- 2023年 CISO 需要高度关注的任务和趋势
在过去的几年中,企业一直忙于应对远程办公模式下的安全要求.展望2023年,疫情局面将与过去3年大不相同.根据目前的趋势,未来一年的网络攻击的数量和严重程度都将增加,这将对各规模企业,尤其是未做好准备的 ...
- 6个步骤强化 CI/CD 安全
快速的数字化和越来越多的远程业务运营给开发人员带来了沉重的负担,他们不断面临着更快推出软件的压力.尽管CI/CD 加速了产品发布,但它容易受到网络安全问题的影响,例如代码损坏.安全配置错误和机密管理不 ...
- PPT 商务报告:如何建立专属PPT素材库
PPT 商务报告:如何建立专属PPT素材库 为什么建立素材库? 省事:直接套用 应对紧急环境:无网络情况下,无法搜索 提升设计思路:帮助提升思路 通用型素材库 企业型素材库 模板 灵感网站 使用场景 ...
- Chrome 英文翻译插件,沙拉查词
下载: https://pan.baidu.com/s/1VRaZzKgyPKc0Qt6Gufk3yw 提取码: chbm 下载: https://pan.baidu.com/s/1VRaZzKgyP ...
- 熔断、限流、降级 —— SpringCloud Alibaba Sentinel
Sentinel 简介 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流.流量整形.熔断降级.系统负载保护.热点防护等多个维度来帮助开发者保 ...
- 国内加速访问Github的办法
说明 自从GitHub私有库免费后,又涌入了一大批开发爱好者. 但国内访问GitHub的速度实在是慢得一匹,在clone仓库时甚至只有10k以下的速度,大大影响了程序员的交友效率. 国内加速访问Git ...
- 【Cxx 20】使用 std::span 代替数组指针传参
我们知道std::string_view可以创建std::string的一个视图,视图本身并不拥有实例,它只是保持视图映射的状态.在不修改实例的情况下,使用std::string_view会让字符串处 ...
- #1495:非常可乐(BFS+数论)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 BFS解法 题目 给三个数字 s n m s=n+m s在1到100之间 就是个倒水问题可以从第 ...