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