【问题标题】:Problem with checking NaN as truthy/falsy检查 NaN 为真/假的问题
【发布时间】:2019-03-12 02:16:35
【问题描述】:

我在freecodecamp上做算法挑战,他们提供的解决方案真的很整洁:

function bouncer(arr) {
  return arr.filter(Boolean);
}

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

 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;
}

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

bouncer([1, null, NaN, 2, undefined])

返回:

[1, NaN, 2]

关于如何测试 NaN 的任何想法?

【问题讨论】:

  • bouncer([false, null, 0, NaN, undefined, ""]) returns: [1, NaN, 2] 嗯? 12s 是从哪里来的?我无法复制
  • 这一行if (arr[i] == false || arr[i] === null || arr[i] === NaN || arr[i] === undefined) 也可以像if ( ! arr[i] ) 一样完成。你几乎检查了那里的所有假值。
  • 抱歉,修改并更正了函数调用,谢谢!

标签: javascript arrays nan


【解决方案1】:

问题是NaN !== NaN:

console.log(NaN === NaN);

(这是有道理的,因为NaN 只是一个占位符,表示人们会预期一个数字,但无法计算出数值 - 例如,0 / 0 (@987654325 @)!== ('foo' * 3)(NaN))

相反,您可以使用Number.isNaN,它将检查传递的值是否为NumberNaN

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, ""]));

确保使用Number.isNaN 而不是简单的isNaN,这将不希望地排除真实的非数字。

【讨论】:

  • 您好!谢谢,Akrion 也发表了评论,但我觉得我遗漏了重要的细节,即真实(而不是数字)的事情也需要通过。您的解决方案也解决了这个问题!赞一个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
相关资源
最近更新 更多