检查 NaN 为真/假时出现问题

kev*_*vin 2 javascript arrays nan

我正在 freecodecamp 上进行算法挑战,他们提供的解决方案非常整洁:

function bouncer(arr) {
  return arr.filter(Boolean);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,作为一个菜鸟并且没有考虑那个高阶函数,我创建了这个冗长的怪物:

 function bouncer(arr) {
    let truthyArray = [];
    let falsyArray = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] == false || arr[i] === null || arr[i] === NaN || arr[i] === undefined) {
            falsyArray.push(arr[i]);
        } else {
            truthyArray.push(arr[i]);
        }
    }
    return truthyArray;
}
Run Code Online (Sandbox Code Playgroud)

在之前的测试中,它似乎完成了工作。然而,NaN 并没有配合。

bouncer([1, null, NaN, 2, undefined])
Run Code Online (Sandbox Code Playgroud)

返回:

[1, NaN, 2]
Run Code Online (Sandbox Code Playgroud)

关于如何测试 NaN 有什么想法吗?

Cer*_*nce 5

问题是NaN !== NaN

console.log(NaN === NaN);
Run Code Online (Sandbox Code Playgroud)

(这是有道理的,因为NaN它只是一个占位符,用于表示需要数字的位置,但无法计算数值 - 例如,0 / 0( NaN) !== ('foo' * 3)( NaN))

相反,您可以使用Number.isNaN,它将检查传递的值是否是 aNumber和 is NaN

console.log(Number.isNaN(NaN));

function bouncer(arr) {
  let truthyArray = [];
  let falsyArray = [];
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] == false || arr[i] === null || Number.isNaN(arr[i]) || arr[i] === undefined) {
      falsyArray.push(arr[i]);
    } else {
      truthyArray.push(arr[i]);
    }
  }
  return truthyArray;
}

console.log(bouncer([false, null, 0, NaN, undefined, ""]));
Run Code Online (Sandbox Code Playgroud)

确保使用Number.isNaN而不是 plain isNaN,这会意外地排除真实的非数字。