当前位置: 首页 > news >正文

使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值

使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值

JavaScript 中的 ?? 运算符称为 nullish 合并运算符。该运算符接受任一侧的操作数,并且仅当左侧操作数为空值时才返回右侧操作数。这个运算符绝对是一个较新的运算符,它是在 ES2020 期间引入 JavaScript 的。

falsy 和 nullish 是相同的吗

如果在布尔表达式中求值时将值强制为 false ,则该值被视为 falsy 值。在这方面,以下值被认为是 falsy 值:

null - 空值
undefined - 未被赋值
false - boolean类型的一个值
0 - 数字0
-0 - 数字0的负数
"" - 空字符
NaN - 非数字

那么,JavaScript 中什么被认为是 nullish 呢?。JavaScript 中的除了 null 或 undefined 的值之外的都是 nullish。

在实际操作该运算符之前,我们应该了解短路运算符的工作原理。

短路运算符

短路运算符基本上是 逻辑与 ( &&) 和 逻辑或 ( || )运算符。它们用于执行简洁的条件逻辑。

&& 运算符

语法:

expression1 && expression2
  • 如果表达式 1 为假并且根本不计算表达式 2,则返回表达式 1

  • 如果表达式 1 为真(除 falsy 值以外的任何值),则返回表达式 2

看一下这个示例

// 返回表达式1
const number = 0 && 100
console.log(number) // 0
// 因为0是falsy值,因此不需要计算表达式2,直接返回表达式1(也就是0)// 返回表达式2
const heroes = 'IronMan' && 'CaptainAmerica'
console.log(heroes) // CaptainAmerica
// 表达式1是一个非空字符,因此直接返回表达式2(也就是 CaptainAmerica)

|| 运算符

语法:

expression1 || expression2
  • 如果表达式 1 为真,则返回表达式 1
  • 如果表达式 1 为假则返回表达式 2

就这么简单。

看一下这个示例:

// 返回表达式1
const heroes = 'IronMan' || 'CaptainAmerica'
console.log(heroes) // 'IronMan'
// 表达式1是一个非空字符,为 truthy 值,直接返回表达式1// 返回表达式2
const number = 0 || 100
console.log(number) //100
// 0 是 falsy 值,直接返回表达2

?? 运算符

除了 && 和 || 之外,还存在另一个运算符,称为空合并运算符。而且,该运算符就像逻辑运算符的特例,其操作与 || 运算符类似。

由于|| 当左侧操作数为 falsy 时,该运算符返回右侧表达式。而空合并 ?? 运算符仅在左侧操作数为 null 或 undefined 时才返回右侧表达式。所以,?? 运算符比现有的 || 运算符更加严格。

语法:

expression1 ?? expression2

仅当 表达式1 为 null 或 undefined 时,?? 运算符才返回表达式2 。同时,如果表达式1是 nullish 值以外的任何值,则返回表达式1。

// 示例1
const number = 0 ?? 100
console.log(number) // 0
// 0 为非 nullish// 示例2
let fruit = ''
let veggie = 'Carrot'
const basket = fruit ?? veggie
console.log(basket) // ''
// fruit 虽然是空字符,但是是 falsy 值而非 nullish// 示例3
let halves = 'fullPortion' / 2
let full = 1
const portion = halves ?? full
console.log(portion) // NaN// 示例4
let hero1
let hero2 = 'CaptainAmerica'
const heroes = hero1 ?? hero2
console.log(heroes) // 'CaptainAmerica'
// hero1为undefined,是 nullish值

?? 运算符的设计方式使其不能直接与 && 和 || 一起使用,而需要使用括号:

null || undefined ?? 'hi' // SyntaxError: missing ) after argument list(null || undefined) ?? 'hi' //'hi'

为什么要使用短路运算符

当我们看到一些不熟悉的语法可以工作时,这个问题就会出现。难道我们不能坚持使用经典的 if else 语法来量化表达式吗?是的,我们可以,但是不行。让我解释一下为什么会这样。只要我们使用纯 JavaScript,我们就可以使用 if else 条件。但当涉及到使用像 ReactJs 这样的前端 UI 库时,不可能在 JSX 结构中嵌入“if 语句”。在这方面,我们应该只使用使用逻辑运算符的表达式。

这不是唯一的用例。但是这些短路运算符(包括空合并运算符)避免了用单行代码不必要地执行表达式。

我们可以使用短路运算符构建更复杂的逻辑,如下所示:

const gameConfig1 = { playerName: 'John',score: 22500,highScore: 35000,
}
const gameConfig2 = { playerName: undefined, score: undefined,highScore: undefined
}
function getPlayerInfo( player ){const { playerName, score, highScore } = playerconst currentPlayerName= playerName ?? 'Guest'const currentPlayerScore = ( score >= 100 && score ) || 'No scores yet'const currentPlayerHighScore = highScore ?? 'No high scores yet'return { currentPlayerName, currentPlayerScore , currentPlayerHighScore }
}
const player1 = getPlayerInfo( gameConfig1 ) // { name: John, score: 22500, highScore: 35000 }
const player2 = getPlayerInfo( gameConfig2 ) // { name: 'Guest', score: 'No scores yet', highScore: 'No high scores yet' }

相关文章:

  • Vue中的数据变化监控与响应——深入理解Watchers
  • 数据分析为何要学统计学(10)——如何进行比率检验
  • 【jmeter】接口测试流程
  • 阿里云部署k8s with kubesphere
  • PMP项目管理 - 资源管理
  • Python Django 连接 PostgreSQL 操作实例
  • 【Linux基础命令使用】
  • Elasticsearch的使用总结
  • React Hooks解决了什么问题?
  • 2020-XNUCA babyv8
  • 机器学习算法---聚类
  • Spring Boot中实现订单30分钟自动取消的策略
  • PDF如何转换制作成翻页电子书
  • 【数据结构—队列的实现】
  • LeedCode刷题---滑动窗口问题(二)
  • 自己简单写的 事件订阅机制
  • [译]CSS 居中(Center)方法大合集
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 4个实用的微服务测试策略
  • django开发-定时任务的使用
  • jquery ajax学习笔记
  • JS变量作用域
  • Js基础知识(一) - 变量
  • Linux后台研发超实用命令总结
  • magento 货币换算
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring security oauth2 password授权模式
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从setTimeout-setInterval看JS线程
  • 基于遗传算法的优化问题求解
  • 经典排序算法及其 Java 实现
  • 力扣(LeetCode)22
  • 如何学习JavaEE,项目又该如何做?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用 QuickBI 搭建酷炫可视化分析
  • 移动端 h5开发相关内容总结(三)
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • const的用法,特别是用在函数前面与后面的区别
  • Java性能优化之JVM GC(垃圾回收机制)
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • # Java NIO(一)FileChannel
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (3)STL算法之搜索
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (四)Linux Shell编程——输入输出重定向
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Linux下编译安装log4cxx