Cho mảng chứa giá trị truthy và falsy. Viết hàm trả về mảng chỉ số của các phần tử là NaN trong mảng gốc.
NaN !== NaN
Kiểu dữ liệu NaN thực chất là number. Dù NaN là giá trị falsy, nó có tính chất đặc biệt: NaN === NaN luôn false. Chỉ có NaN mới có tính chất này. Ta dùng điều này để tìm chỉ số NaN.
Ví dụ 1: Dùng NaN !== 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));Dùng isNaN() / Number.isNaN()
isNaN() trả về true nếu giá trị là NaN hoặc có thể ép thành NaN. Number.isNaN() chỉ trả về true nếu giá trị thực sự là NaN. Number.isNaN() tin cậy hơn.
Ví dụ 2: So sánh hai cách
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));Kết quả
Đầu ra sẽ là:
{
reliableWay: [ 4, 6, 9, 12 ],
unreliableWay: [ 2, 3, 4, 6, 8, 9, 12]
}Rõ ràng isNaN() tính sai nhiều giá trị không phải NaN. Do đó Number.isNaN() tin cậy hơn.