เรามีอาร์เรย์ขององค์ประกอบที่มีทั้งค่าจริงและเท็จ งานของเราคือเขียนฟังก์ชันที่คืนค่าอาร์เรย์พร้อมดัชนีขององค์ประกอบที่เป็น NaN ในอาร์เรย์ต้นฉบับ
NaN !== NaN
ชนิดข้อมูลของ NaN จริงๆ แล้วคือ number แม้ NaN จะเป็นค่า falsy แต่มีคุณสมบัติพิเศษที่ไม่มีชนิดข้อมูลหรือตัวแปรอื่นมี นั่นคือ นิพจน์ 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() คืนค่า true หรือ false ตามว่าค่าที่ให้มาเป็น NaN หรือสามารถบังคับให้เป็น NaN ได้ ในขณะที่ Number.isNaN() คืนค่า true ก็ต่อเมื่อค่าที่ให้มาเป็น NaN จริงๆ
ดังนั้น Number.isNaN() เป็นวิธีที่น่าเชื่อถือกว่า 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() คำนวณค่า non-NaN หลายค่าเป็น NaN นั่นคือเหตุผลที่ Number.isNaN() น่าเชื่อถือกว่า