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。我能做得更好吗?
当前回答
我试图检查输入是否为空,然后相应地使用该值。这是我的密码。
let valueToBeConsidered = !inputValue ? "trueCondition" : "falseCondition",
因此,如果inputValue为空,则valueToBeConsidered=false条件;如果inputValue具有值,则valuetoBeConsided=true条件
其他回答
如果||作为C#??的替代品??在您的情况下还不够好,因为它包含空字符串和零,所以您可以始终编写自己的函数:
function $N(value, ifnull) {
if (value === null || value === undefined)
return ifnull;
return value;
}
var whatIWant = $N(someString, 'Cookies!');
使用Babel的用户需要升级到最新版本才能使用零合并(??):
Babel 7.8.0默认支持新的ECMAScript 2020功能:不需要启用单独的插件来进行无效合并(??),可选的链接(?.)和动态导入()不再带有预设env
从…起https://babeljs.io/blog/2020/01/11/7.8.0
ECMAScript 2021启用了两个新功能:
空合并运算符(??),是一种逻辑运算符,当左侧操作数为空或未定义时,返回右侧操作数,否则返回左侧操作数。
设b=未定义??5.console.log(b);//5.
逻辑零赋值(x??=y)运算符,仅在x具有零值(空或未定义)时赋值。
常量车={速度:20};车速??=5.控制台日志(轿厢速度);汽车名称??=“雷诺”;console.log(car.name);
有关逻辑零赋值的更多信息,请参阅此处https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment
有关空合并运算符的更多信息,请参阅此处https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
这里有两项:
逻辑或
const foo=“”|“默认字符串”;
console.log(foo);//输出为“默认字符串”
空合并运算符
常量foo=''??'默认字符串';
console.log(foo);//输出为空字符串,即“”
零合并运算符(??)是一种逻辑运算符,当左侧操作数为空或未定义时,它返回右侧操作数,否则返回左侧操作数。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
?? 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)