คำถามสัมภาษณ์งาน JavaScript ที่มักเจอ

โดย Aaron Cao · อัปเดตเมื่อ

คำถามสัมภาษณ์งาน JavaScript ที่มักเจอ
ควรเตรียมพื้นฐานให้พร้อม ได้แก่ closures, event loop, การ binding ของ this, prototype และการทำ scoping ด้วย var, let และ const จากนั้นจะเป็นแบบฝึกหัดเขียนโค้ด เช่น การ implement debounce, การทำ array ให้แบนราบ หรือการเขียน promise utility รวมถึงหัวข้อเกี่ยวกับเบราว์เซอร์อย่าง event delegation ส่วนการสัมภาษณ์ระดับ senior จะเพิ่มเรื่อง async pattern และ performance เข้ามาด้วย

ควรเตรียมพื้นฐานให้พร้อม ได้แก่ closures, event loop, การ binding ของ this, prototype และการทำ scoping ด้วย var, let และ const จากนั้นจะเป็นแบบฝึกหัดเขียนโค้ด เช่น การ implement debounce, การทำ array ให้แบนราบ หรือการเขียน promise utility รวมถึงหัวข้อเกี่ยวกับเบราว์เซอร์อย่าง event delegation ส่วนการสัมภาษณ์ระดับ senior จะเพิ่มเรื่อง async pattern และ performance เข้ามาด้วย

พื้นฐาน JavaScript แบบไหนที่ถูกถามบ่อยที่สุด

รายการคำถาม JavaScript ดูเหมือนจะไม่มีที่สิ้นสุด และการท่องจำคำถามแบบสุ่มคือวิธีที่ช้าที่สุดในการฝ่าฟันมัน ส่วนนี้จะจำกัดขอบเขตให้เหลือแค่แนวคิดที่ผู้สัมภาษณ์มักย้อนกลับมาถามในแทบทุกรอบ เพื่อให้การฝึกของคุณตรงกับการกระจายตัวของคำถามจริง ห้าหัวข้อต่อไปนี้ครอบคลุมการสัมภาษณ์รอบคัดกรองส่วนใหญ่

  • Closures function จับอะไรไว้บ้าง บั๊กคลาสสิกเรื่องตัวแปรใน loop และเหตุผลที่ module pattern ใช้งานได้
  • Event loop call stack, task queue และ microtask queue รวมถึงลำดับการพิมพ์ log ในตัวอย่างที่ผสมกัน
  • การ binding ของ this แบบ default, implicit, explicit ด้วย call และ apply และความแตกต่างของ arrow function
  • Prototype การค้นหา property ตามสาย chain และสิ่งที่ syntax class ถูกคอมไพล์ไปเป็นจริง ๆ
  • Scoping var เทียบกับ let และ const, hoisting และ temporal dead zone

การแปลงค่าความเท่ากันด้วย == เทียบกับ ===, truthiness และ array method อย่าง map, filter และ reduce คือส่วนที่เหลือของระดับคัดกรอง ถ้าคุณอธิบายแต่ละหัวข้อข้างต้นออกมาดัง ๆ ได้ภายในเวลาไม่ถึงหนึ่งนาที รอบพื้นฐานก็ถือว่าผ่านฉลุย

ควรฝึกแบบฝึกหัดเขียนโค้ดแบบไหนบ้าง

นอกจากคำถามเชิงแนวคิดแล้ว รอบสัมภาษณ์ JavaScript ส่วนใหญ่จะมีแบบฝึกหัด implement สั้น ๆ ที่ต้องทำสด ๆ ชุดคำถามที่เจอซ้ำ ๆ นั้นมีไม่มาก และคุ้มค่าที่จะฝึกจนกว่าแต่ละข้อจะใช้เวลาแค่ไม่กี่นาที ไม่ใช่หลายรอบของการลองผิดลองถูก

  • Implement debounce และ throttle พร้อมบอกว่าแต่ละตัวเหมาะกับสถานการณ์ไหน
  • ทำ nested array ให้แบนราบ ทั้งแบบใช้ recursion และไม่ใช้
  • เขียน Promise.all เวอร์ชันย่อที่ reject ทันทีที่มีความล้มเหลวครั้งแรก
  • สร้าง event emitter เล็ก ๆ ที่มี on, off และ emit
  • ทำ deep clone ของ object แล้วบอกว่าเวอร์ชันของคุณพลาดกรณีไหนไปบ้าง

ตัวอย่างเช่น ผู้สมัครสาย front-end ที่สัมภาษณ์ตำแหน่งระดับกลาง อาจได้ debounce เป็นโจทย์วอร์มอัพ จากนั้นจะถูกขอให้เชื่อมมันเข้ากับช่องค้นหา แล้วอธิบายว่าเกิดอะไรขึ้นกับ request ที่ยังค้างอยู่ คำถามตามหลังต่างหากคือบททดสอบตัวจริง ผู้สัมภาษณ์จะขยายโจทย์ออกไปเรื่อย ๆ เพื่อดูว่าความเข้าใจภาษาของคุณไปสิ้นสุดที่ตรงไหน

การฝึกพูดออกเสียงต่อหน้าผู้สัมภาษณ์ที่คอยโต้แย้งกลับ คือสิ่งที่ทำให้ความรู้ติดแน่นในหัว หน้า mock interview พูดถึงวิธีจัดเซสชันจับเวลาพร้อมคำถามตามหลัง

คำถามเรื่องเบราว์เซอร์และ async หน้าตาเป็นอย่างไร

ตำแหน่งที่เกี่ยวกับเบราว์เซอร์จะเพิ่มอีกชั้นหนึ่งเหนือพื้นฐานของภาษา event delegation คือแกนกลาง เหตุผลที่ listener ตัวเดียวบน parent ดีกว่าใส่นับพันตัวใน child แต่ละตัว bubbling ทำให้สิ่งนี้เกิดขึ้นได้อย่างไร และ capture phase สำคัญตอนไหน DOM update batching, layout thrashing และสิ่งที่ทำให้เกิด reflow มักปรากฏในรอบคัดกรองที่เน้นเรื่อง performance

คำถามเกี่ยวกับ async ได้ลงตัวเป็นรูปแบบมาตรฐานแบบหนึ่งแล้ว นั่นคือโค้ดที่ผสม setTimeout, promise chain และฟังก์ชัน async เข้าด้วยกัน แล้วให้คุณทายลำดับของ output คำตอบขึ้นอยู่กับลำดับระหว่าง microtask กับ macrotask และผู้สัมภาษณ์สนใจเหตุผลมากกว่าลำดับเอง การจัดการ error ข้าม await boundary การเทียบ promise chaining กับ nesting และการให้ request แข่งกันด้วย Promise.race คือส่วนที่เหลือของกลุ่มคำถามนี้

ความแตกต่างของรอบเหล่านี้ระหว่างรูปแบบ coding, behavioral และ system design ถูกพูดถึงใน หน้ารวมประเภทการสัมภาษณ์

ควรฝึกอย่างไรให้นำไปใช้ได้จริงในรอบสัมภาษณ์

การอ่านคำตอบให้ความรู้สึกว่ามีประสิทธิภาพ แต่แทบไม่ช่วยให้นำไปใช้ได้จริง รอบสัมภาษณ์ต้องพูดออกเสียง จับเวลา และโต้ตอบกันไปมา การฝึกจึงต้องเป็นแบบเดียวกัน ลองทำเซสชันจำลองที่คุณพูดอธิบายไปพร้อมกับพิมพ์ ถูกขัดจังหวะด้วยคำถามตามหลัง และแข่งกับเวลา แรงกดดันแบบนี้เองที่ทำให้การดึงความรู้ออกมาใช้กลายเป็นเรื่องอัตโนมัติ ชุดคำถามเฉพาะภาษาและสแตกอื่น ๆ อยู่ใน หน้ารวมคลังคำถาม

ข้อเท็จจริงที่ควรรู้ไว้ รอบสัมภาษณ์ JavaScript จริงมักเกิดขึ้นใน editor ที่แชร์กัน โดยหน้าจอของคุณมองเห็นได้ตลอด และการประเมินที่มีผู้คุมสอบจะบันทึกภาพไว้ด้วย ผู้ช่วยมีไว้สำหรับการเตรียมตัวและฝึกซ้อม ไม่ใช่สำหรับหน้าจอที่แชร์สดตอนนั้น ในจุดที่การช่วยเหลือแบบสดเป็นเรื่องถูกต้องเหมาะสม เช่น ระหว่างสัมภาษณ์ทางโทรศัพท์ที่ไม่มีการแชร์หน้าจอ หรือช่วงฝึกซ้อมส่วนตัวของคุณเอง overlay ของ SubcueAI จะอยู่แค่ในเครื่องของคุณเท่านั้น และไม่มีบอทตัวไหนเข้าร่วมสายเลย

คำถามที่พบบ่อย

สัมภาษณ์ JavaScript มีแต่โจทย์แบบ LeetCode เท่านั้นหรือเปล่า

ปกติแล้วไม่ใช่ คำถามอัลกอริทึมทั่วไปก็ปรากฏบ้าง แต่รอบที่เจาะจง JavaScript จะเน้นกลไกของภาษา เช่น closures, event loop และการ binding ของ this รวมถึงการ implement เล็ก ๆ ที่ใช้งานได้จริง อย่าง debounce หรือ event emitter

นักพัฒนาระดับ junior ควรโฟกัสอะไรก่อน

Scoping, closures, array method และการอธิบาย == เทียบกับ === ให้ชัดเจน นักพัฒนา junior มักตกรอบคัดกรองเพราะพื้นฐานไม่แน่น มากกว่าการไม่รู้หัวข้อขั้นสูงอย่าง generator หรือ proxy

จะอธิบาย event loop แบบง่าย ๆ ได้อย่างไร

สรุปเป็นประโยคเดียว โค้ด synchronous จะรันบน call stack callback ที่ทำเสร็จแล้วจะรอใน queue และหลังจาก stack รันจบแต่ละรอบ engine จะเคลียร์ microtask ทั้งหมด เช่น callback ของ promise ให้เสร็จก่อน แล้วจึงหยิบ macrotask ถัดไป เช่น timer มาทำ จากนั้นลองไล่ดูตัวอย่างลำดับ log สักตัวอย่างหนึ่ง

สัมภาษณ์ JavaScript ครอบคลุม TypeScript ด้วยหรือไม่

นับวันจะยิ่งครอบคลุมมากขึ้น โดยเฉพาะถ้าทีมใช้งานอยู่ ควรเตรียมรับคำถามเรื่อง typing พื้นฐาน, union, generics ในระดับที่ใช้งานได้จริง และสิ่งที่ TypeScript รับประกันหรือไม่รับประกันตอน runtime แต่พื้นฐาน JavaScript ก็ยังคงเป็นตัวตัดสินรอบนี้อยู่ดี

คำถามที่เกี่ยวข้อง

← เพิ่มเติมเกี่ยวกับ คำถามสัมภาษณ์ตามตำแหน่งและหัวข้อ