es6新增的运算符-链判断运算符的诞生[?.]和null的判断运算符??

简介: 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?.() 
//返回undefined
console.log(message.say?.())


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。


也就是说,这一行代码包括了两级属性的判断

相关文章
|
算法
三元运算符 return mData == null ? 0 : mData.size();的含义
三元运算符 return mData == null ? 0 : mData.size();的含义
59 0
|
JavaScript 前端开发 测试技术
JavaScript:void(null) 运算符
JavaScript:void(null) 运算符
134 0
|
安全
运算符:指数-链判断-Null判断-逻辑赋值
运算符:指数-链判断-Null判断-逻辑赋值
83 0
|
缓存 Java
SpringBoot——Thymeleaf中的四种字面量(文本、数字、布尔、null)、字符串拼接、运算符
SpringBoot——Thymeleaf中的四种字面量(文本、数字、布尔、null)、字符串拼接、运算符
SpringBoot——Thymeleaf中的四种字面量(文本、数字、布尔、null)、字符串拼接、运算符
|
6月前
|
机器学习/深度学习 SQL 关系型数据库
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
【MySQL进阶之路丨第十一篇】一文带你精通MySQL NULL值处理、正则表达式
85 0
|
6月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之从MySQL同步数据到Doris时,历史数据时间字段显示为null,而增量数据部分的时间类型字段正常显示的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
152 2
|
3月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 IS NULL
【8月更文挑战第12天】
639 0
在 MySQL 中使用 IS NULL
|
3月前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
119 0
|
4月前
|
SQL 存储 索引
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值
MySQL设计规约问题之为什么应该把字段定义为NOT NULL并且提供默认值