อาทิตย์ที่ผ่านมาเพื่อนผมในทีมได้รับ support case ว่า JavaScript API ที่ support อยู่ไม่รองรับค่า null ที่ server โผล่มา คือพอ server ส่ง null ลงมาเป็นค่าใน json แบบนี้
{"data":null}
แล้วที่ browser จะเจ๊งเลย แล้วโยน error TypeError: is null ทำนองนี้ขึ้นมา
พอลองตรวจสอบดูพบว่าปกติ server ถ้าข้อมูลมีค่ามันจะส่งลงมาเป็น object ซ้อนอีกทีแบบนี้
{"data":{"a":1,"h":"FFFFF"}}
พอลองดู code JavaScript ที่ใช้ดึงค่า จะ check ว่าเป็น object หรือไม่ ถ้าใช่ก็ดึงค่า propery a หรือ h ออกมาใช้งาน ทำนองนี้
function process_data(data){ if(typeof data ==="object"){ console.log('a='+a.a+',h='+a.h); } }
code มันก็ดูเหมือนจะได้อ่ะนะ แต่พอ check typeof refference ดูก็พบว่า typeof จะ return ผลการตรวจค่า null ออกมาเป็น “object” เสมอ พอ server ส่ง null มาเลยไม่รอด ไป access key ที่ไม่มีจริงก็เลยเจ๊งกันไป ซึ่งผมเองก็เพิ่งรู้เหมือนกันว่า typeof มันใช้ตรวจค่า null ไม่ได้ เพราะปกติใช้แต่ if check เอา – -”
เลยลองดูง่ายๆ บน JavaScript Console (เซ็งตรงมันต้องเขียน line เดียวนี่แหละ)
var nn=null; if(typeof nn==='object'){ console.log('object'); }else{ console.log('else'); } //print 'object' if(nn){ console.log('value'); }else{ console.log('else'); } //print 'else'
ก็เลยได้รู้ว่า typeof มันใช้ check null ไม่ได้ (แต่ check undefined ได้นะ)
มันจะมีทำไมทั้ง null ทั้ง undefined (╯°□°)╯︵ ┻━┻
ผมไม่เคยใช้ typeof เลยมั้ง 😛
มีเหตุผลอยู่ในนี้อะ https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/typeof เห็นว่าพยายามจะเปลี่ยนด้วยแต่ว่าลองเปลี่ยนใน V8 แล้ว code เก่าเจ๊งเลยโดน reject เบย 😛
คอนโซลขึ้นบรรทัดใหม่ด้วย shift+enter ได้นะครับ หรือจะเขียนหลายๆ บรรทัดข้างนอกแล้วก๊อบมาวางก็ได้ครับ