没有人在这里提到NaN
, 这对我来说也是一个空值的潜力。所以,我想我会加上我的两美分。
对于给定的代码:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
如果您要使用||
运算符,您将获得第一个非假值:
var result = a || b || c || d || e || f; // result === 1
如果您使用新的??
(空合并)运算符,您将得到c
,其值为:NaN
vas result = a ?? b ?? c ?? d ?? e ?? f; // result === NaN
这些对我来说都不是正确的。在我自己的合并逻辑小世界中,这可能与您的世界不同,我认为 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 ) { //arg === arg is false for NaN
return arg;
}
}
return null;
}