如何在 JavaScript 数组中检查 NaN 关键字是否存在


我们有一个包含真值和假值的元素数组。我们的任务是编写一个函数,该函数返回一个数组,其中包含原始数组中所有 NaN 元素的索引。

NaN !== NaN

NaN 的数据类型实际上是数字。尽管 NaN 是一个假值,但它具有其他任何数据类型或变量都不具有的特殊属性。那就是表达式 NaN === NaN 返回 false。并且只有在 NaN 的情况下才会返回 false。

因此,我们可以利用这种特性来选择 NaN 值的索引。代码如下:

const arr = [7, 1, "123abc", undefined, NaN, 78, NaN, null, "aes", NaN,
'', null, NaN];
const pickNaN = (arr) => {
   return arr.reduce((acc, val, ind) => {
      if(val !== val){
         acc.push(ind);
      };
      return acc;
   }, []);
};
console.log(pickNaN(arr));

使用 isNaN() / Number.isNaN()

isNaN() 函数根据提供的值是否为 NaN 或是否可以强制转换为 NaN 返回 true 或 false。而 Number.isNaN() 函数仅在提供的值实际上是 NaN 时才返回 true。

因此,与 isNaN() 相比,Number.isNaN() 是检查 NaN 的可靠方法。代码输出的差异如下所示。

示例

const arr = [7, 1, "abc", undefined, NaN, 78, NaN, null, "aes", NaN, '',
null, NaN];
const pickNaN = (arr) => {
   return arr.reduce((acc, val, ind) => {
      if(Number.isNaN(val)){
         acc.reliableWay.push(ind);
      };
      if(isNaN(val)){
         acc.unreliableWay.push(ind);
      }
      return acc;
   }, {
      reliableWay: [],
      unreliableWay: []
   });
};
console.log(pickNaN(arr));

此代码准备了两个数组,一个使用 Number.isNaN(),另一个使用 isNaN()。

输出

输出将是:

{
   reliableWay: [ 4, 6, 9, 12 ],
   unreliableWay: [ 2, 3, 4, 6, 8, 9, 12]
}

我们可以清楚地看到 isNaN() 如何将许多非 NaN 值计算为 NaN。这就是 Number.isNaN() 成为更可靠方法的原因。

更新于: 2020-08-21

948 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告