在 JavaScript 数组中查找 NaN 的索引

15
[1, 2, 3].indexOf(3) => 2

[1, 2, NaN].indexOf(NaN) => -1

[1, NaN, 3].indexOf(NaN) => -1

1
如果你只是想知道一个数组是否包含 NaN,你可以使用 Array.prototype.includes[NaN].includes(NaN) /* true */ - Константин Ван
3个回答

15

您可以使用Array.prototype.findIndex方法在数组中查找NaN的索引

let index = [1,3,4,'hello',NaN,3].findIndex(Number.isNaN)
console.log(index)

您可以使用Array.prototype.includes来检查数组中是否存在NaN。但它不会给出索引!!它将返回一个布尔值。如果存在NaN,则返回true,否则返回false。

let isNaNPresent = [1,2,NaN,'ball'].includes(NaN)
console.log(isNaNPresent)

不要使用Array.prototype.indexOf

你不能使用Array.Prototype.indexOf在数组中查找NaN的索引。因为indexOf内部使用strict-equality-operator,而NaN === NaN的结果是false。所以indexOf无法检测数组中的NaN。

[1,NaN,2].indexOf(NaN) // -1

使用Number.isNaN代替isNaN

我选择Number.isNaN而不是isNaN。因为isNaN字符串字面量视为NaN。另一方面,Number.isNaN只将NaN字面量视为NaN

isNaN('hello world') // true
Number.isNaN('hello world') // false

或者,编写自己的逻辑:

您可以编写自己的逻辑来查找NaN。正如您已经知道的那样,NaN是JavaScript中唯一的一个值,它不等于自身。这就是我建议不要使用Array.prototype.indexOf的原因。

NaN === NaN // false

我们可以使用这个思路来编写自己的isNaN函数。
[1,2,'str',NaN,5].findIndex(e=>e!=e) // 3

这里直接传入isNaN函数会不会更清晰?此外,findIndex在更多的实现中都可用,所以它只是降低了此答案的可移植性。 - Will S
1
@WillS 我已经修改了我的回答。 - AL-zami

13

1
计时器结束后我会点赞并接受。那很愚蠢。 - mcandre
向IEEE解释吧,它们的浮点标准定义NaN不等于任何东西。(话虽如此,在关系型数据库中可以将其视为NULL。) - geekosaur
1
-1 也被用作错误值。-1 != -1 有任何意义吗? - mcandre
4
@mcandre,这并不是愚蠢的。NaN 的整个意义在于表示在该域中被认为无法表示的事物。这不是某一种类型的事物,而是许多种。例如,你不可能说负数的平方根 i 等同于零除以自身(不定),然而它们都是 NaN。 - paxdiablo
我理解。但从实际角度来看,如果我想从一个数组中提取所有的NaN,将元素与NaN进行比较会比调用isNaN()更有用。 - mcandre

2
你需要查看每个项,以返回一个包含NaN值索引的数组。
function findNaNs(arr){
    return arr.map(function(itm, i){
        if(isNaN(itm)) return i;
        return false;
    }).filter(function(itm){
        return itm;
    });
}

findNaNs([1, NaN, 3, 4, 'cat'/3])

//或者只找第一个-

function firstNaN(arr){
    var i= 0, L= arr.length;
    while(i<L){
        if(isNaN(arr[i])) return i;
        ++i;
    }
    return -1;
}

谢谢你,kennebec。绕过这个问题编码并不难,只是有点麻烦。 - mcandre
1
永远不要使用 isNaN,它是有问题的。它会隐式地转换值类型。例如:对于 isNaN(undefined)isNaN({})(但不包括 isNaN([])),你会得到 true。相反,可以使用自身进行比较: x !== x (只有 NaN 不等于自身)。 - Nelo Mitranim
第一个例程无法找到NaN,如果它是第一个元素。 - Ziyuan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接