相关内容JavaScript中是否存在“空合并”操作符?JavaScript现在有一个??我看到使用更频繁的运算符。以前大多数JavaScript代码使用||。
let userAge = null
// These values will be the same.
let age1 = userAge || 21
let age2 = userAge ?? 21
在什么情况下会??||表现不同?
相关内容JavaScript中是否存在“空合并”操作符?JavaScript现在有一个??我看到使用更频繁的运算符。以前大多数JavaScript代码使用||。
let userAge = null
// These values will be the same.
let age1 = userAge || 21
let age2 = userAge ?? 21
在什么情况下会??||表现不同?
当前回答
基于MDN文档:
与逻辑OR(||)运算符相反,如果左操作数是一个非空或未定义的假值,则返回该操作数。
概念的例子:
当使用||为一个非undefined或null的假值时: || 'name';// ==>返回'name 但是当使用??上述情况: 假的? ?“名字”;// ==>返回false
真实的例子: 假设,我们有一个电话变量,在我们的表单中不是强制性的,空字符串(")对我们是有效的,我们想要doSomething()如果电话变量为空或未定义,现在猜猜看:
当使用||为一个非undefined或null的假值时: Const phone = ";//假设它从某个动作变成了空字符串 手机|| doSomething();// ==>该死,doSomething是运行 //但我们想要运行它,如果它是' undefined '或' null '空字符串是有效的 但是当使用??上述情况: Const phone = ";//与上述假设相同 电话? ?doSomething ();// ==>是的,没错 //空字符串对我们是有效的,doSomething不运行
注意:实际上这是一个例子,在一个真实的项目中,你可以更好地理解这个可爱的操作用法。
注意:对于undefined或null,它们都是相互作用的。
其他回答
当||被用作布尔条件时,该值为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。
作为一个非常简短的规则,你可以用相反的方式来看待它:
|| (or)返回第一个“真值”(如果不存在“真值”则返回最后一个值) ?? (null coalescing)返回第一个“定义”值(如果不存在“定义”值,则返回最后一个值)
例子
x = false || true; // --> true (the first 'truthy' value - parameter 2)
x = false ?? true; // --> false (the first 'defined' value - parameter 1)
如MDN所述:
与逻辑OR(||)运算符相反,如果左操作数是一个非空或未定义的假值,则返回该操作数。换句话说,如果您使用||为另一个变量foo提供一些默认值,如果您认为一些错误的值可用,则可能会遇到意想不到的行为(例如。或0)。更多示例见下文。
还有在你链接的问题的答案中:
无论第一个操作数的类型是什么,如果将其强制转换为布尔型结果为false,则赋值操作将使用第二个操作数。注意以下所有情况: 警报(布尔(null));/ /错误 警报(布尔(定义));/ /错误 警报(布尔(0));/ /错误 alert(布尔(" "));/ /错误 警报(布尔(“false”));// true—gotcha!:)
基于MDN文档:
与逻辑OR(||)运算符相反,如果左操作数是一个非空或未定义的假值,则返回该操作数。
概念的例子:
当使用||为一个非undefined或null的假值时: || 'name';// ==>返回'name 但是当使用??上述情况: 假的? ?“名字”;// ==>返回false
真实的例子: 假设,我们有一个电话变量,在我们的表单中不是强制性的,空字符串(")对我们是有效的,我们想要doSomething()如果电话变量为空或未定义,现在猜猜看:
当使用||为一个非undefined或null的假值时: Const phone = ";//假设它从某个动作变成了空字符串 手机|| doSomething();// ==>该死,doSomething是运行 //但我们想要运行它,如果它是' undefined '或' null '空字符串是有效的 但是当使用??上述情况: Const phone = ";//与上述假设相同 电话? ?doSomething ();// ==>是的,没错 //空字符串对我们是有效的,doSomething不运行
注意:实际上这是一个例子,在一个真实的项目中,你可以更好地理解这个可爱的操作用法。
注意:对于undefined或null,它们都是相互作用的。
OR运算符||如果左为假则使用右值,而空合并运算符??如果左为空或未定义,则使用右值。
如果缺少第一个操作符,这些操作符通常用于提供默认值。
但如果你的左值可能包含""或0或false(因为这些是假值),则OR运算符||可能会有问题:
console.log(12 || "not found") // 12
console.log(0 || "not found") // "not found"
console.log("jane" || "not found") // "jane"
console.log("" || "not found") // "not found"
console.log(true || "not found") // true
console.log(false || "not found") // "not found"
console.log(undefined || "not found") // "not found"
console.log(null || "not found") // "not found"
在许多情况下,如果左为null或未定义,您可能只需要右值。这就是空合并运算符??是:
console.log(12 ?? "not found") // 12
console.log(0 ?? "not found") // 0
console.log("jane" ?? "not found") // "jane"
console.log("" ?? "not found") // ""
console.log(true ?? "not found") // true
console.log(false ?? "not found") // false
console.log(undefined ?? "not found") // "not found"
console.log(null ?? "not found") // "not found"
而??operator在当前的LTS版本的Node (v10和v12)中不可用,你可以在某些版本的TypeScript或Node中使用它:
的? ?operator在2019年11月被添加到TypeScript 3.7中。
最近,??operator被包含在ES2020中,由Node 14(2020年4月发布)支持。
当空合并运算符??是支持的,我通常使用它而不是OR运算符||(除非有很好的理由不这样做)。