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.就会返回--默认值。
* */
可选链操作符(?.)的详细讲解
在 ES2020中引入, ?. 是可选链操作符。
用于简化访问[对象深层属性时]的[安全性]检查。
它可以避免[因中间]属性为 null 或 undefined 而导致的 TypeError 错误。
左侧的对象是否为null或undefined。
如果是的,就不再往下运算,而是返回undefined
本质上,?.运算符相当于一种短路机制,只要不满足条件,就不再往下执行。
换一句话说:如果 ?. 左侧为 null 或 undefined,右侧的代码不会执行:
可选链操作符-判断对象是否有某个方法
let message={
// say:function(){
// console.log('hello word')
// }
}
//如果没有该方法,则不会被执行的哈
message.say?.()
它表达的意思是: message.say如果有定义,就会调用该方法。
否则message.say直接返回undefined,不再执行?.后面的部分。
//对于那些可能没有实现的方法,这个运算符尤其有用。
if (myForm.checkValidity?.() === undefined) {
// 表单校验失败
return;
}
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
遇见问题,这是你成长的机会,如果你能够解决,这就是收获。
作者:晚来南风晚相识
出处:https://www.cnblogs.com/IwishIcould/
本文版权归作者所有,欢迎转载,未经作者同意须保留此段声明,在文章页面明显位置给出原文连接
如果文中有什么错误,欢迎指出。以免更多的人被误导。
出处:https://www.cnblogs.com/IwishIcould/
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!
万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!

支付宝

微信
如果文中有什么错误,欢迎指出。以免更多的人被误导。