9 ปัญหาสุดฮาในการเขียนโปรแกรมด้วยภาษา Javascript ที่นักพัฒนามักพบ
มีหลายปัญหาที่นักพัฒนา Javascript มักจะพบเจอ ซึ่งบางครั้งก็ดูเหมือนจะเป็นเรื่องตลกเพราะเกิดขึ้นบ่อยหรือมาจากข้อผิดพลาดเล็ก ๆ น้อย ๆ ที่คิดไม่ถึง ตัวอย่างเช่น
-
การลืมใส่
var
,let
, หรือconst
x = 10;เมื่อลืมประกาศตัวแปรด้วย
var
,let
, หรือconst
ตัวแปรนี้จะกลายเป็นตัวแปร global โดยอัตโนมัติ ซึ่งอาจสร้างปัญหาที่ไม่คาดคิดได้ -
ผลลัพธ์ของ
typeof NaN
console.log(typeof NaN); // "number"แม้ว่า
NaN
(Not a Number) จะหมายถึงไม่ใช่ตัวเลข แต่typeof NaN
กลับคืนค่าเป็น "number" ซึ่งสร้างความสับสนให้กับนักพัฒนามากมาย -
การใช้
==
แทน===
console.log(0 == false); // true
console.log(0 === false); // falseการใช้
==
อาจทำให้เกิดการเปรียบเทียบที่ไม่คาดคิดเนื่องจากการเปลี่ยนชนิดข้อมูลอัตโนมัติ การใช้===
จะแก้ปัญหานี้ได้เพราะมันจะไม่เปลี่ยนชนิดข้อมูลก่อนเปรียบเทียบ -
การลืมใส่
break
ในswitch
switch(day) {
case 1:
console.log("Monday");
case 2:
console.log("Tuesday");
}เมื่อลืมใส่
break
หลังจากcase
จะทำให้โปรแกรมรันผ่านทุกกรณีที่เหลือจนจบ ซึ่งอาจทำให้ได้ผลลัพธ์ที่ไม่ถูกต้อง -
ฟังก์ชันที่ไม่มี
return
คืนค่าundefined
function doSomething() {
// no return statement
}
console.log(doSomething()); // undefinedหากลืมใส่
return
ในฟังก์ชัน จะทำให้ฟังก์ชันนั้นคืนค่าundefined
ซึ่งอาจทำให้นักพัฒนาเกิดความสับสน -
การลืมว่า
this
มีค่าเปลี่ยนแปลงconst obj = {
name: "John",
sayHello: function() {
setTimeout(function() {
console.log(this.name);
}, 1000);
}
};
obj.sayHello(); // undefinedในตัวอย่างนี้
this
ภายในฟังก์ชันที่ถูกส่งให้setTimeout
จะไม่ใช่obj
อีกต่อไป ซึ่งอาจทำให้การเข้าถึงคุณสมบัติของobj
ไม่เป็นไปตามที่คาดหวัง -
การเข้าถึง
array
ที่ไม่มีค่าด้วยundefined
const arr = [1, 2, 3];
console.log(arr[5]); // undefinedเมื่อพยายามเข้าถึงสมาชิกของ array ที่ไม่มีค่า จะได้ค่า
undefined
แทนที่จะเป็นข้อผิดพลาด ซึ่งอาจทำให้เกิดความสับสนในการตรวจสอบข้อผิดพลาด -
การลืมใส่
await
ในการเรียกใช้งานฟังก์ชันแบบ asynchronousasync function fetchData() {
const result = someAsyncFunction();
console.log(result); // Promise {<pending>}
}การลืมใส่
await
จะทำให้ได้ค่าPromise
กลับมาแทนที่จะเป็นผลลัพธ์ที่ต้องการจากฟังก์ชันนั้น -
การลืมใส่
;
ท้ายคำสั่งlet a = 5
let b = 10
let c = a + b
console.log(c) // 15ถึงแม้ว่า JavaScript จะมีการเพิ่มเครื่องหมาย
;
ให้โดยอัตโนมัติในหลาย ๆ กรณี (Automatic Semicolon Insertion หรือ ASI) แต่การลืมใส่;
เองบางครั้งอาจทำให้เกิดพฤติกรรมที่ไม่คาดคิดได้ โดยเฉพาะเมื่อเชื่อมหลายคำสั่งในบรรทัดเดียวหรือใช้รูปแบบที่ ASI ไม่จัดการได้ดี
ปัญหาเหล่านี้เกิดขึ้นบ่อยครั้ง แต่หลายครั้งก็เป็นเรื่องตลกเมื่อมองย้อนกลับไป เพราะส่วนใหญ่เกิดจากการละเลยหรือความเข้าใจผิดเล็ก ๆ น้อย ๆ ของนักพัฒนาเอง