这里没有人提到NaN的潜在作用,对我来说这也是一种“null-ish”值。因此,我想加入我的意见。
针对给定的代码:
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
如果您使用新的??
(null coalescing)运算符,则会得到值为NaN
的变量c
。
vas result = a ?? b ?? c ?? d ?? e ?? f
对我来说,这两个方法都不正确。在我的合并逻辑的小世界里(可能与你的不同),我认为undefined、null和NaN都是“null-ish”的。因此,我期望从合并方法中得到d
(零)。
如果有人的大脑像我一样,并且想要排除NaN
,那么这个定制的coalesce
方法(与这里发布的方法不同)就可以完成这个任务:
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 ) {
return arg;
}
}
return null;
}
x ?? y
语法现在处于一阶段提案状态 - 空值合并。 - Aprillionx ?? y
)和可选链式操作符(user.address?.street
)现在都达到了第四阶段。这意味着什么呢?请看这篇文章的详细描述:https://2ality.com/2015/11/tc39-process.html#stage-4%3A-finished 。 - Mass Dot Net