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。我能做得更好吗?
当前回答
请注意null的JavaScript特定定义。javascript中“无值”有两个定义。1.空:当变量为空时,表示该变量中不包含数据,但该变量已在代码中定义。这样地:
var myEmptyValue = 1;
myEmptyValue = null;
if ( myEmptyValue === null ) { window.alert('it is null'); }
// alerts
在这种情况下,变量的类型实际上是Object。测试它。
window.alert(typeof myEmptyValue); // prints Object
未定义:当一个变量之前没有在代码中定义,并且正如预期的那样,它不包含任何值。这样地:如果(myUndefinedValue==undefined){window.alert('it is undefined');}//警报
如果是这种情况,则变量的类型为“undefined”。
注意,如果您使用类型转换比较运算符(==),JavaScript将对这两个空值起同等作用。要区分它们,请始终使用类型严格比较运算符(==)。
其他回答
注意,React的create-React-app工具链支持自3.3.0版(发布于5.12.2019)以来的空合并
可选的链接和空合并运算符我们现在支持可选的链接和无效合并运算符!//可选链接一(); // 如果“a”为空/未定义,则为undefinedbc、 //如果“b”为空/未定义,则未定义//空聚结未定义??'其他默认值';//result:'其他默认值'空??'其他默认值';//result:'其他默认值''' ?? '其他默认值';//结果:“”0 ?? 300; // 结果:0假的??真;//结果:false
也就是说,如果你使用create-react-app3.3.0+,你可以开始在你的react应用中使用空联合运算符。
现在,它在Chrome、Edge、Firefox、Safari等主流浏览器的最新版本中得到了完全支持。下面是空运算符和空合并运算符的比较
const response = {
settings: {
nullValue: null,
height: 400,
animationDuration: 0,
headerText: '',
showSplashScreen: false
}
};
/* OR Operator */
const undefinedValue = response.settings.undefinedValue || 'Default Value'; // 'Default Value'
const nullValue = response.settings.nullValue || 'Default Value'; // 'Default Value'
const headerText = response.settings.headerText || 'Hello, world!'; // 'Hello, world!'
const animationDuration = response.settings.animationDuration || 300; // 300
const showSplashScreen = response.settings.showSplashScreen || true; // true
/* Nullish Coalescing Operator */
const undefinedValue = response.settings.undefinedValue ?? 'Default Value'; // 'Default Value'
const nullValue = response.settings.nullValue ?? ''Default Value'; // 'Default Value'
const headerText = response.settings.headerText ?? 'Hello, world!'; // ''
const animationDuration = response.settings.animationDuration ?? 300; // 0
const showSplashScreen = response.settings.showSplashScreen ?? true; // false
链接多个值/多个值
启用“短路”:如果第一个值之一有效,则不进行任何进一步评估这意味着顺序很重要,最左边的值优先
const value = first ?? second ?? third ?? "default";
这里没有人提到NaN的潜力,对我来说,它也是一个空值。所以,我想再加上两美分。
对于给定代码:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
如果要使用||运算符,将获得第一个非false值:
var result = a || b || c || d || e || f; // result === 1
如果你使用新的??(空合并)运算符,将得到c,其值为:NaN
vas result = a ?? b ?? c ?? d ?? e ?? f; // result === NaN
我觉得这两个都不对。在我自己的联合逻辑小世界里,我认为未定义的、空的和NaN都是“空的”。所以,我希望从联合方法中得到d(零)。
如果任何人的大脑都像我一样工作,并且你想排除NaN,那么这个定制的联合方法(与这里发布的方法不同)将实现这一点:
function coalesce() {
var i, undefined, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg !== null && arg !== undefined
&& (typeof arg !== 'number' || arg.toString() !== 'NaN') ) {
return arg;
}
}
return null;
}
对于那些希望代码尽可能简短,并且不介意有点不够清晰的人,您也可以按照@impinball的建议使用此选项。这利用了NaN永远不等于NaN的事实。你可以在这里读到更多:为什么NaN不等于NaN?
function coalesce() {
var i, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg != null && arg === arg ) { //arg === arg is false for NaN
return arg;
}
}
return null;
}
如果||作为C#??的替代品??在您的情况下还不够好,因为它包含空字符串和零,所以您可以始终编写自己的函数:
function $N(value, ifnull) {
if (value === null || value === undefined)
return ifnull;
return value;
}
var whatIWant = $N(someString, 'Cookies!');