[1, 2, 3].indexOf(3) => 2
[1, 2, NaN].indexOf(NaN) => -1
[1, NaN, 3].indexOf(NaN) => -1
[1, 2, 3].indexOf(3) => 2
[1, 2, NaN].indexOf(NaN) => -1
[1, NaN, 3].indexOf(NaN) => -1
您可以使用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
[1,2,'str',NaN,5].findIndex(e=>e!=e) // 3
NaN被定义为不等于任何东西(甚至不等于它自己)。请参见此处:http://www.w3schools.com/jsref/jsref_isNaN.asp
NaN
不等于任何东西。(话虽如此,在关系型数据库中可以将其视为NULL
。) - geekosauri
等同于零除以自身(不定),然而它们都是 NaN。 - paxdiablofunction 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;
}
isNaN(undefined)
和 isNaN({})
(但不包括 isNaN([])
),你会得到 true
。相反,可以使用自身进行比较: x !== x
(只有 NaN
不等于自身)。 - Nelo Mitranim
NaN
,你可以使用Array.prototype.includes
:[NaN].includes(NaN) /* true */
。 - Константин Ван