相关内容JavaScript中是否存在“空合并”操作符?JavaScript现在有一个??我看到使用更频繁的运算符。以前大多数JavaScript代码使用||。

let userAge = null

// These values will be the same. 
let age1 = userAge || 21
let age2 = userAge ?? 21

在什么情况下会??||表现不同?


当前回答

如MDN所述:

与逻辑OR(||)运算符相反,如果左操作数是一个非空或未定义的假值,则返回该操作数。换句话说,如果您使用||为另一个变量foo提供一些默认值,如果您认为一些错误的值可用,则可能会遇到意想不到的行为(例如。或0)。更多示例见下文。

还有在你链接的问题的答案中:

无论第一个操作数的类型是什么,如果将其强制转换为布尔型结果为false,则赋值操作将使用第二个操作数。注意以下所有情况: 警报(布尔(null));/ /错误 警报(布尔(定义));/ /错误 警报(布尔(0));/ /错误 alert(布尔(" "));/ /错误 警报(布尔(“false”));// true—gotcha!:)

其他回答

简而言之,当您关心从一个可能为空的未定义源分配一个变量时,并且希望为该变量提供一个默认值,请使用空合并运算符??

如果您想避免被伪真理[1]的JavaScript定义搞得一团糟,那么就不要使用||。

空聚结算子??

JavaScript中falsy的定义

angular的一个真实例子

/* parse the url pattern 
/search?keyword=mykeyword&page=3
/search?keyword=mykeyword
*/

  ngOnInit(): void {
    const keyword = this.route.snapshot.queryParamMap.get('keyword') ?? 'default keyword';
    const page = this.route.snapshot.queryParamMap.get('page') ?? '0';
    this.queryResult$ = this.service.getQueryResult(keyword, +page);
    this.keyword = keyword;
  }

[1]: 每种编程语言都有自己对伪真理的定义。判断一个值是否为真值的基本方法是,如果显式类型转换函数bool(value)的结果为真,则该值为真值。

对于那些可能跨语言工作,PHP和c#也有??参考PHP, c#。

当||被用作布尔条件时,该值为false。例如:

let userAge = false

// These values will be the same. 
let age1 = userAge || 21 // 21
let age2 = userAge ?? 21 // false

逻辑上的OR仍然会为任何不为true的值给出下一个值。在这种情况下,它给出的值是21。在哪里? ?只处理null和undefined。

简而言之

空合并运算符??区分:

null值(null, undefined) 虚实但定义的值(false, 0,”等)

||(逻辑或)处理这两个相同。

我创建了一个简单的图形来说明JavaScript中null和falsey值的关系:

进一步的解释:

let x, y

x = 0
y = x || 'default'            // y = 'default'
y = x ?? 'default'            // y = 0

如上所述,操作符之间的差异??||是一个检查空值,一个检查假值。然而,在许多情况下,它们的行为是相同的。这是因为在JavaScript中,每个空值都是假值(但不是每个假值都是空值)。

利用我们上面学到的知识,我们可以为不同的行为创建一些例子:

let y

y = false || 'default'       // y = 'default'
y = false ?? 'default'       // y = false

y = 0n || 'default'          // y = 'default'
y = 0n ?? 'default'          // y = 0n

y = NaN || 'default'         // y = 'default'
y = NaN ?? 'default'         // y = NaN

y = '' || 'default'          // y = 'default'
y = '' ?? 'default'          // y = ''

由于新的Nullish Coalescing Operator可以区分无值和假值,因此,如果您需要检查是否没有字符串或空字符串,它将非常有用。一般来说,你可能会使用??而不是||大多数时候。

最后也是最不重要的是,这里有两个例子,它们表现相同:

let y

y = null || 'default'        // y = 'default'
y = null ?? 'default'        // y = 'default'

y = undefined || 'default'   // y = 'default'
y = undefined ?? 'default'   // y = 'default'

基于MDN文档:

与逻辑OR(||)运算符相反,如果左操作数是一个非空或未定义的假值,则返回该操作数。

概念的例子:

当使用||为一个非undefined或null的假值时: || 'name';// ==>返回'name 但是当使用??上述情况: 假的? ?“名字”;// ==>返回false

真实的例子: 假设,我们有一个电话变量,在我们的表单中不是强制性的,空字符串(")对我们是有效的,我们想要doSomething()如果电话变量为空或未定义,现在猜猜看:

当使用||为一个非undefined或null的假值时: Const phone = ";//假设它从某个动作变成了空字符串 手机|| doSomething();// ==>该死,doSomething是运行 //但我们想要运行它,如果它是' undefined '或' null '空字符串是有效的 但是当使用??上述情况: Const phone = ";//与上述假设相同 电话? ?doSomething ();// ==>是的,没错 //空字符串对我们是有效的,doSomething不运行

注意:实际上这是一个例子,在一个真实的项目中,你可以更好地理解这个可爱的操作用法。

注意:对于undefined或null,它们都是相互作用的。

如MDN所述:

与逻辑OR(||)运算符相反,如果左操作数是一个非空或未定义的假值,则返回该操作数。换句话说,如果您使用||为另一个变量foo提供一些默认值,如果您认为一些错误的值可用,则可能会遇到意想不到的行为(例如。或0)。更多示例见下文。

还有在你链接的问题的答案中:

无论第一个操作数的类型是什么,如果将其强制转换为布尔型结果为false,则赋值操作将使用第二个操作数。注意以下所有情况: 警报(布尔(null));/ /错误 警报(布尔(定义));/ /错误 警报(布尔(0));/ /错误 alert(布尔(" "));/ /错误 警报(布尔(“false”));// true—gotcha!:)