9 ปัญหาสุดฮาในการเขียนโปรแกรมด้วยภาษา Javascript ที่นักพัฒนามักพบ

มีหลายปัญหาที่นักพัฒนา Javascript มักจะพบเจอ ซึ่งบางครั้งก็ดูเหมือนจะเป็นเรื่องตลกเพราะเกิดขึ้นบ่อยหรือมาจากข้อผิดพลาดเล็ก ๆ น้อย ๆ ที่คิดไม่ถึง ตัวอย่างเช่น
-
การลืมใส่
var,let, หรือconstx = 10;เมื่อลืมประกาศตัวแปรด้วย
var,let, หรือconstตัวแปรนี้จะกลายเป็นตัวแปร global โดยอัตโนมัติ ซึ่งอาจสร้างปัญหาที่ไม่คาดคิดได้ -
ผลลัพธ์ของ
typeof NaNconsole.log(typeof NaN); // "number"แม้ว่า
NaN(Not a Number) จะหมายถึงไม่ใช่ตัวเลข แต่typeof NaNกลับคืนค่าเป็น "number" ซึ่งสร้างความสับสนให้กับนักพัฒนามากมาย -
การใช้
==แทน===console.log(0 == false); // true
console.log(0 === false); // falseการใช้
==อาจทำให้เกิดการเปรียบเทียบที่ไม่คาดคิดเนื่องจากการเปลี่ยนชนิดข้อมูลอัตโนมัติ การใช้===จะแก้ปัญหานี้ได้เพราะมันจะไม่เปลี่ยนชนิดข้อมูลก่อนเปรียบเทียบ -
การลืมใส่
breakในswitchswitch(day) {
case 1:
console.log("Monday");
case 2:
console.log("Tuesday");
}เมื่อลืมใส่
breakหลังจากcaseจะทำให้โปรแกรมรันผ่านทุกกรณีที่เหลือจนจบ ซึ่งอาจทำให้ได้ผลลัพธ์ที่ไม่ถูกต้อง -
ฟังก์ชันที่ไม่มี
returnคืนค่าundefinedfunction 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ที่ไม่มีค่าด้วยundefinedconst 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 ไม่จัดการได้ดี
ปัญหาเหล่านี้เกิดขึ้นบ่อยครั้ง แต่หลายครั้งก็เป็นเรื่องตลกเมื่อมองย้อนกลับไป เพราะส่วนใหญ่เกิดจากการละเลยหรือความเข้าใจผิดเล็ก ๆ น้อย ๆ ของนักพัฒนาเอง