JavaScript Wierd Things (Part 3)

         อ่าาาา มาถึง part ที่ 3 กันแล้วเยยยยยย้ และในที่สุดเราก็ออกนอกหัวข้อ Type casting แล้วเย้ๆๆๆ แต่จะว่าไปภาษา JS นี่มีอะไรแปลกเยอะเหมือนกันนะ อีกกี่ part จะจบครับเนี่ย ตอนนี้ผู้อ่านคงคิดว่า ไอนี้บ่นอะไรของมัน ฮ่ารอช้าอยู่ไย ไปกันเลยหัวข้อใหม่กับ..

NaN

        NaN ในที่นี้ไม่ได้แปลว่า ไม่ แต่ย่อมาจาก Not a number หรือ ไม่ใช่ตัวเลข ซึ่งเกิดขึ้นจาก

  1. ไม่สามารถแปลงเป็นตัวเลขได้ เช่น parseInt("foo") หรือ Number(undefined)
  2. การดำเนินการทางคณิตศาสตร์ที่ผลลัพธ์ไม่เป็นจำนวนจริง เช่น Math.sqrt(-1)
  3. ตัวถูกดำเนินการมีค่าเป็น NaN เช่น 7 ** NaN
  4. หา limit ไม่ได้
  5. การดำเนินการใด ๆ ที่เกี่ยวข้องกับสตริงและไม่ใช่การดำเนินการบวก

        แล้วมันแปลกยังไงละ? สิ่งที่แปลกคือต่อจากนี้ต่างหากโดยปกติทุกสิ่งทุกอย่างนั้นมีค่าเท่าตัวมันเอง เช่น 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


        สำหรับวันนี้ขอลาไปก่อนกับมีมตลกๆ ขอบคุณคร๊าบบบบบ






ความคิดเห็น

  1. ตรวจงานให้แล้วนะครับ เราไม่ได้ลง วีดีโอ นะครับ

    ตอบลบ

แสดงความคิดเห็น