JavaScript Wierd Things (Part 3)
อ่าาาา มาถึง part ที่ 3 กันแล้วเยยยยยย้ และในที่สุดเราก็ออกนอกหัวข้อ Type casting แล้วเย้ๆๆๆ แต่จะว่าไปภาษา JS นี่มีอะไรแปลกเยอะเหมือนกันนะ อีกกี่ part จะจบครับเนี่ย ตอนนี้ผู้อ่านคงคิดว่า ไอนี้บ่นอะไรของมัน ฮ่ารอช้าอยู่ไย ไปกันเลยหัวข้อใหม่กับ..
NaN
NaN ในที่นี้ไม่ได้แปลว่า ไม่ แต่ย่อมาจาก Not a number หรือ ไม่ใช่ตัวเลข ซึ่งเกิดขึ้นจาก
- ไม่สามารถแปลงเป็นตัวเลขได้ เช่น parseInt("foo") หรือ Number(undefined)
- การดำเนินการทางคณิตศาสตร์ที่ผลลัพธ์ไม่เป็นจำนวนจริง เช่น Math.sqrt(-1)
- ตัวถูกดำเนินการมีค่าเป็น NaN เช่น 7 ** NaN
- หา limit ไม่ได้
- การดำเนินการใด ๆ ที่เกี่ยวข้องกับสตริงและไม่ใช่การดำเนินการบวก
แล้วมันแปลกยังไงละ? สิ่งที่แปลกคือต่อจากนี้ต่างหากโดยปกติทุกสิ่งทุกอย่างนั้นมีค่าเท่าตัวมันเอง เช่น 8 มีค่าเท่ากับ 8 เป็นต้น ก็แน่อยู่แล้วไม่เหรอ? ใช่และไม่ใช่ ถ้าจะให้พูดให้ถูกคือ ทุกตัวยกเว้น NaN เพราะว่า NaN มีค่าไม่เท่ากับ NaN ไงละ
ห้ะ? Why? สาเหตุก็เป็นเพราะถ้าหาก NaN มีค่าเท่ากันอาจทำให้โปรแกรมทำงานผิดพลาดได้ เช่นเราต้องการเปรียบเทียบ Expression ว่า Expression 1 กับ Expression 2 นั้นได้ผลลัพธ์ที่เป็นตัวเลขเท่ากันหรือไม่ แต่บังเอิญว่า Expression 1 และ Expression 2 คำนวณได้ผลลัพธ์เป็น NaN ทั้งคู่ ซึ่งถ้าหาก NaN มีค่าเท่ากับ NaN ก็จะทำให้โปรแกรมทำงานต่อไป ส่งผลให้โปรแกรมทำงานผิดพลาด (Logic Bug)
อ่าว แล้วถ้าเราต้องการจะตรวจสอบค่านั้นๆว่าเป็น NaN หรือไม่ละ? ในเคสนั้นเราจะใช้ build-in function ที่ชื่อว่า isNaN
Syntax : isNaN(value)
เช่น
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN(true); // false
isNaN(null); // false
isNaN(37); // false
// strings
isNaN('37'); // false: "37" ถูกแปลงเป็นตัวเลข 37 ซึ่งไม่ได้มีค่าเป็น NaN
isNaN('37.37'); // false: "37.37" ถูกแปลงเป็นตัวเลข 37.37 ซึ่งไม่ได้มีค่าเป็น NaN
isNaN("37,5"); // true
isNaN('123ABC'); // true: parseInt("123ABC") ได้ 123 แต่ Number("123ABC") ได้ NaN
isNaN(''); // false: สตริงว่างแปลงแล้วได้ตัวเลข 0 ซึ่งไม่ได้มีค่าเป็น NaN
isNaN(' '); // false: สตริงช่องว่างแปลงแล้วได้ตัวเลข 0 ซึ่งไม่ได้มีค่าเป็น NaN
// dates
isNaN(new Date()); // false
isNaN(new Date().toString()); // true
// นี้คือกรณีที่ได้ผลลัพธ์เป็นจริงที่ไม่เป็นจริง และเป็นเหตุผลที่ isNaN ไม่น่าเชื่อถือมากนัก
isNaN('blabla'); // true: "blabla"ถูกแปลงเป็นตัวเลข
// "blabla" ไม่สามารถแปลงเป็นตัวเลขได้ทำให้ได้ค่า NaN
จบกันไปแล้วกับหัวข้อ NaN ครับสั้นๆครับหัวข้อนี้ สุดท้ายนี้มีเกร็ดตลกๆตบท้ายก่อนไป คือ
ถึงแม้ว่า NaN นั้นจะย่อมาจาก Not a Number ก็จริงแต่เมื่อเราลองตรวจสอบประเภทของ NaN ดูเราจะได้คำตอบมาว่า NaN นั้นเป็น Number
สำหรับวันนี้ขอลาไปก่อนกับมีมตลกๆ ขอบคุณคร๊าบบบบบ
ตรวจงานให้แล้วนะครับ เราไม่ได้ลง วีดีโอ นะครับ
ตอบลบ