空值合并操作符

简介

当读取对象属性的时候,如果某个属性的值是 nullundefined,有时候需要为它们指定默认值。常见做法是通过||运算符指定默认值。

const text = settings.headerText || 'Hello, world!'

开发者的目的是,属性的值为 nullundefined,默认值生效,但是属性的值如果为空字符串或 false0,默认值也会生效。

为了避免这种情况,ES2020 引入了空值合并操作符??。空值合并操作符是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。

语法

使用空值合并操作符

在这个例子中,使用空值合并操作符为常量提供默认值,保证常量不为 null 或者 undefined

const nullValue = null
const emptyText = '' // 空字符串,是一个假值,Boolean("") === false
const someNumber = 42

const valA = nullValue ?? 'valA 的默认值'
const valB = emptyText ?? 'valB 的默认值'
const valC = someNumber ?? 0

console.log(valA) // "valA 的默认值"
console.log(valB) // ""(空字符串虽然是假值,但不是 null 或者 undefined)
console.log(valC) // 42

短路

与 OR 和 AND 逻辑操作符相似,当左表达式不为 nullundefined 时,不会对右表达式进行求值。

function foo() {
  console.log('函数 foo 被调用了')
}

console.log(undefined ?? foo())
// "函数 foo 被调用了"

console.log(false ?? foo())
// 右侧表达式没有被执行

与 AND 或 OR 操作符共用,需要带 ()

// 报错
lhs && middle ?? rhs
lhs ?? middle && rhs
lhs || middle ?? rhs
lhs ?? middle || rhs

加入括号表示优先级

;(lhs && middle) ?? rhs
lhs && (middle ?? rhs)(lhs ?? middle) && rhs
lhs ?? (middle && rhs)(lhs || middle) ?? rhs
lhs || (middle ?? rhs)(lhs ?? middle) || rhs
lhs ?? (middle || rhs)
Copyright © 零度实验室 2020 all right reserved,powered by Gitbook修订时间: 2021-07-02 10:46:52

results matching ""

    No results matching ""