这里没有人提到过的潜力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
var result = coalesce(a,b,c,d,e,f); // result.toString() === '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;
}
x ?? y
语法现在处于第1阶段的提案状态- 无效合并