Javascript中是否有空合并运算符?
例如,在C#中,我可以这样做:
String someString = null;
var whatIWant = someString ?? "Cookies!";
我可以为Javascript找到的最佳近似是使用条件运算符:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
这有点讨厌IMHO。我能做得更好吗?
Javascript中是否有空合并运算符?
例如,在C#中,我可以这样做:
String someString = null;
var whatIWant = someString ?? "Cookies!";
我可以为Javascript找到的最佳近似是使用条件运算符:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
这有点讨厌IMHO。我能做得更好吗?
当前回答
function coalesce() {
var len = arguments.length;
for (var i=0; i<len; i++) {
if (arguments[i] !== null && arguments[i] !== undefined) {
return arguments[i];
}
}
return null;
}
var xyz = {};
xyz.val = coalesce(null, undefined, xyz.val, 5);
// xyz.val now contains 5
此解决方案与SQL联合函数类似,它接受任意数量的参数,如果它们都没有值,则返回null。它的行为类似于C#??运算符,即“”、false和0被视为NOT NULL,因此算作实际值。如果你来自.net背景,这将是最自然的感觉解决方案。
其他回答
我试图检查输入是否为空,然后相应地使用该值。这是我的密码。
let valueToBeConsidered = !inputValue ? "trueCondition" : "falseCondition",
因此,如果inputValue为空,则valueToBeConsidered=false条件;如果inputValue具有值,则valuetoBeConsided=true条件
是的,它的建议现在是第四阶段。这意味着该提案已准备好纳入正式的ECMAScript标准。您已经可以在Chrome、Edge和Firefox的最新桌面版本中使用它,但我们需要等待一段时间,直到该功能达到跨浏览器的稳定性。
查看以下示例以演示其行为:
//注意:只有在运行上述浏览器的最新版本时,这才有效const var1=未定义;const var2=“回退值”;常量结果=var1??var2;console.log(`${result}`中的空合并结果);
上一示例等效于:
const var1=未定义;const var2=“回退值”;常量结果=(var1!==null&&var1!===undefined)?变量1:var2;console.log(`${result}`中的空合并结果);
请注意,无效合并不会像||运算符那样威胁虚假值(它只检查未定义的值或空值),因此下面的代码片段将如下所示:
//注意:只有在运行上述浏览器的最新版本时,这才有效常量var1=“”;//空字符串const var2=“回退值”;常量结果=var1??var2;console.log(`${result}`中的空合并结果);
对于TypesScript用户,从TypeScript 3.7开始,该功能现在也可用。
它有望很快在Javascript中提供,因为截至2020年4月,它处于提案阶段。您可以在此处监视状态以获得兼容性和支持-https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
对于使用Typescript的用户,您可以使用Typescript 3.7中的零合并运算符
从文档中-
你可以想到这个功能-??操作员-作为“跌倒”的方式当处理null或undefined时,返回到默认值。当我们编写类似代码让x=foo??bar();这是一种新的说法,即当foo值为“present”时将使用它;但当它为空或未定义时,在其位置计算bar()。
逻辑零赋值,2020+解决方案
当前正在向浏览器中添加新的运算符??=。这将组合空合并运算符??赋值运算符=。
注意:这在公共浏览器版本中尚不常见。将随可用性更改而更新。
??= 检查变量是否未定义或为空,如果已定义则短路。如果没有,则将右侧值分配给变量。
基本示例
let a // undefined
let b = null
let c = false
a ??= true // true
b ??= true // true
c ??= true // false
对象/阵列示例
let x = ["foo"]
let y = { foo: "fizz" }
x[0] ??= "bar" // "foo"
x[1] ??= "bar" // "bar"
y.foo ??= "buzz" // "fizz"
y.bar ??= "buzz" // "buzz"
x // Array [ "foo", "bar" ]
y // Object { foo: "fizz", bar: "buzz" }
浏览器支持1月22日-89%
Mozilla文档
?? vs | | vs&&
其他答案中没有一个能比较这三个答案。由于贾斯汀·约翰逊(Justin Johnson)的评论获得了如此多的选票,而且javascript中的双问号vs&&被标记为这一条的重复,因此在答案中包含&&是有意义的。
首先,受贾斯汀·约翰逊评论的启发:
||返回第一个“truey”值,否则返回最后一个值。&&返回第一个“false”值,否则返回最后一个值。?? 返回第一个非空的、未定义的值,否则返回最后一个值,无论它是什么。
然后,用实时代码演示:
设F1,F2=空,F3=0,F4=“”,F5=parseInt('不是数字(NaN)'),T1=3,T2=8控制台日志(F1||F2||F3||F4||F5||T1||T2)//3(T1)console.log(F1||F2||F3||F4||F5)//NaN(F5)console.log(T1&&T2&&F1&&F2&&F3&&F4&&F5)//未定义(F1)console.log(T1和T2)//8(T2)控制台日志(F1??F2??F3??F4??F5??T1)//0(F3)console.log(F1??F2)//空(F2)