שאלות ראיון TypeScript ו-JavaScript — 36 שאלות
זמן קריאה: 8 דקות
שאלות ראיון JavaScript ו-TypeScript מכסות את יסודות השפה (closures, prototype, this, hoisting), אסינכרוניות, ומערכת הטיפוסים של TypeScript. במדריך זה ריכזנו 36 שאלות ותשובות אמיתיות מקובצות לפי נושא, כפי שנשאלות בישראל. נכון להיום פתוחות אצלנו 44 משרות JavaScript ו-54 משרות TypeScript.
יסודות JavaScript
מה זה closure?
closure הוא פונקציה שזוכרת את הסביבה הלקסיקלית שבה נוצרה, ולכן ניגשת למשתנים של הפונקציה העוטפת גם אחרי שזו הסתיימה. משמש ל-encapsulation, factory functions, ושמירת מצב פרטי.
מה ההבדל בין var, let ו-const?
var הוא function-scoped ומורם (hoisted) עם ערך undefined. let ו-const הם block-scoped ונמצאים ב-temporal dead zone עד ההשמה. const מונע השמה מחדש (אך לא שינוי תוכן אובייקט). בקוד מודרני מעדיפים let/const.
מה זה hoisting?
Hoisting הוא ההעלאה של הכרזות למעלה בסקופ בזמן קומפילציה. הכרזות function מורמות במלואן; var מורם ללא הערך; let/const מורמים אך אינם נגישים עד ההשמה (TDZ). זו סיבה נפוצה לבאגים.
איך פועל this ב-JavaScript?
ערך this נקבע לפי אופן הקריאה: כמתודה על אובייקט — האובייקט; לבד — undefined/global (ב-strict mode undefined); עם call/apply/bind — הערך שהוגדר. arrow functions לא מגדירות this משלהן אלא יורשות מהסביבה.
מה ההבדל בין == ל-===?
=== משווה ערך וטיפוס ללא המרה. == מבצע type coercion לפני ההשוואה, מה שמוביל לתוצאות מפתיעות (למשל 0 == "" הוא true). מומלץ להשתמש תמיד ב-===.
מה זה prototype ו-prototype chain?
כל אובייקט מקושר לאובייקט prototype. כשמחפשים property שלא קיים על האובייקט, המנוע עולה בשרשרת ה-prototype עד שמוצא או מגיע ל-null. זהו מנגנון הירושה של JavaScript, גם מאחורי class syntax.
מה ההבדל בין null ל-undefined?
undefined הוא ערך ברירת המחדל של משתנה שלא הוגדר. null הוא ערך מכוון שמסמן "ריק". typeof null מחזיר "object" (באג היסטורי), בעוד typeof undefined הוא "undefined".
אובייקטים ופונקציות
מה ההבדל בין shallow ל-deep copy?
shallow copy (spread, Object.assign) מעתיק את הרמה העליונה — אובייקטים מקוננים עדיין משותפים בהפניה. deep copy משכפל רקורסיבית (structuredClone או ספרייה). בחירה שגויה גורמת לשינויים לא-צפויים במקור.
מה ההבדל בין map, filter ו-reduce?
map ממפה כל איבר לערך חדש (מחזיר מערך באותו אורך). filter מסנן לפי תנאי. reduce מצמצם מערך לערך יחיד (סכום, אובייקט). כולם יוצרים מערך חדש ואינם משנים את המקור — גישה פונקציונלית.
מה זה destructuring?
destructuring מאפשר לחלץ ערכים ממערך או אובייקט למשתנים בשורה אחת, עם ערכי ברירת מחדל ושמות חלופיים. משפר קריאות, נפוץ בפרמטרים של פונקציות וב-imports.
מה עושה bind, call ו-apply?
call ו-apply מפעילים פונקציה עם this מפורש (call מקבל ארגומנטים בנפרד, apply כמערך). bind מחזיר פונקציה חדשה עם this קבוע, בלי להפעיל אותה מיד. שימושי לשמירת הקשר.
מה זה spread ו-rest operator?
שניהם .... spread מפזר איברים (העתקת מערך/אובייקט, העברת ארגומנטים). rest אוסף איברים למערך (פרמטרים משתנים, destructuring). ההקשר קובע איזה מהם.
מה ההבדל בין arrow function ל-regular function?
arrow function אינה מגדירה this משלה אלא יורשת מהסביבה הלקסיקלית — יתרון ב-callbacks. היא גם חסרה arguments ואינה ניתנת לשימוש כ-constructor. regular function מקבלת this לפי אופן הקריאה. הבחירה משפיעה ישירות על באגים סביב this.
אסינכרוניות
מה זה event loop ב-JavaScript?
ה-event loop מריץ את ה-call stack, ובודק את תור ה-callbacks כשה-stack ריק. microtasks (Promises) קודמים ל-macrotasks (setTimeout). המנגנון מאפשר קוד לא-חוסם ב-thread יחיד.
מה ההבדל בין Promise ל-async/await?
async/await הוא סוכר תחבירי מעל Promises שמאפשר קוד אסינכרוני קריא בסגנון סינכרוני. פונקציית async תמיד מחזירה Promise, ו-await ממתין ל-resolve. שגיאות נתפסות עם try/catch.
מה קורה בשגיאה שלא נתפסת ב-Promise?
נוצר unhandled rejection. בדפדפן ובדרך כלל ב-Node מודרני זה יכול להפיל את התהליך או להירשם כאזהרה. תמיד יש לטפל עם catch או try/catch סביב await.
מה זה debounce ו-throttle?
debounce דוחה ביצוע פונקציה עד שעברה תקופת שקט (למשל חיפוש בזמן הקלדה). throttle מגביל תדירות ביצוע לפרק זמן קבוע (למשל אירועי scroll). שניהם מקטינים עומס מאירועים תכופים.
TypeScript — יסודות
מערכת הטיפוסים היא ליבת ראיון TypeScript. הטבלה מסכמת טיפוסים מיוחדים:
| טיפוס | משמעות | שימוש |
|---|---|---|
| any | מבטל בדיקת טיפוסים | להימנע |
| unknown | כל ערך, מחייב narrowing | קלט לא-ידוע בטוח |
| never | ערך שלא קורה | בדיקת שלמות |
| void | ללא ערך החזרה | פונקציות ללא return |
מה היתרון של TypeScript על JavaScript?
TypeScript מוסיף טיפוסים סטטיים שנבדקים בזמן קומפילציה, ומאפשר לתפוס באגים מוקדם, לקבל autocomplete טוב, ולתחזק קוד גדול בביטחון. הוא מתקמפל ל-JavaScript רגיל שרץ בכל סביבה.
מה ההבדל בין type ל-interface?
interface מיועד לצורת אובייקטים ותומך ב-declaration merging ובהרחבה (extends). type גמיש יותר — תומך ב-unions, tuples ו-mapped types. לחוזים של אובייקטים נפוץ interface; לשאר type.
מה ההבדל בין any, unknown ו-never?
any מבטל בדיקת טיפוסים (לא מומלץ). unknown בטוח יותר — חייבים לצמצם טיפוס לפני שימוש. never מייצג ערך שלעולם לא קורה (פונקציה שזורקת או לולאה אינסופית) ומשמש לבדיקות שלמות.
מה זה union ו-intersection types?
union (A | B) מאפשר ערך מאחד מכמה טיפוסים. intersection (A & B) משלב תכונות של כמה טיפוסים לאחד. union נפוץ ל-state ("loading" | "error"), intersection לשילוב חוזים.
מה זה generics ולמה משתמשים בהם?
generics מאפשרים לכתוב רכיבים ופונקציות שעובדים על טיפוס פרמטרי תוך שמירת בטיחות טיפוסים (למשל Array<T>). כך נמנעים משכפול קוד ומ-any, ושומרים על הקשר בין קלט לפלט.
מה זה enum ומתי כדאי להימנע ממנו?
enum מגדיר קבוצת קבועים בעלי שם. הוא נוח, אך numeric enums מייצרים קוד ריצה ולעיתים מתנהגים באופן לא-צפוי. לרוב עדיף union של literals או const object עם as const.
TypeScript — מתקדם
מה זה type narrowing?
Narrowing הוא צמצום טיפוס לפי בדיקות זמן ריצה (typeof, instanceof, in, discriminated unions). TypeScript מבין את הבדיקות ומדייק את הטיפוס בכל ענף, מה שמאפשר גישה בטוחה לשדות.
מה זה type guard?
type guard הוא ביטוי או פונקציה (עם type predicate כמו x is Cat) שמצמצם טיפוס. מאפשר ל-TypeScript לדעת בבירור מהו הטיפוס בתוך בלוק, במקום להסתמך על any או casts.
מה זה utility types (Partial, Pick, Omit)?
אלו טיפוסים מובנים שמייצרים טיפוסים חדשים מקיימים: Partial הופך שדות לאופציונליים, Pick בוחר שדות, Omit משמיט. חוסכים הגדרות כפולות ושומרים על מקור אמת יחיד לטיפוס.
מה זה discriminated union?
זהו union של אובייקטים עם שדה משותף (discriminant, למשל kind) שערכו קבוע לכל וריאנט. הוא מאפשר narrowing בטוח ב-switch, ודפוס נפוץ למידול state ואירועים.
מה עושה strict mode ב-tsconfig?
strict מפעיל אוסף בדיקות מחמירות (strictNullChecks, noImplicitAny ועוד) שתופסות באגים רבים. מומלץ מאוד לפרויקטים חדשים — הוא מכריח לטפל ב-null/undefined במפורש.
מה זה mapped type ו-conditional type?
mapped type יוצר טיפוס חדש על ידי מעבר על מפתחות של טיפוס קיים (הבסיס ל-Partial ו-Readonly). conditional type בוחר טיפוס לפי תנאי (T extends U ? X : Y). אלו כלים מתקדמים לבניית טיפוסים גנריים חכמים, ונבדקים בראיוני סניור.
מעשי
איך היית מהגר פרויקט JS ל-TS?
הדרגתית: מפעילים allowJs, ממירים קובץ-קובץ, מתחילים מ-strict רך ומהדקים בהדרגה. מוסיפים טיפוסים לגבולות (APIs, מודלים) קודם, ומשתמשים ב-unknown במקום any בזמן המעבר.
איך מטפלים בערכי null/undefined בבטחה?
עם strictNullChecks, optional chaining (?.), nullish coalescing (??), ו-type guards. מונעים "cannot read property of undefined" בכך שמטפלים בהיעדר ערך במפורש במקום להתעלם.
מה ההבדל בין interface ל-class?
interface הוא חוזה בזמן קומפילציה בלבד ונעלם ב-runtime. class מייצר קוד ריצה, יכול להחזיק לוגיקה ומצב, ומאפשר יצירת מופעים. class יכול לממש interface (implements).
מה זה event delegation ב-JavaScript?
במקום להצמיד listener לכל אלמנט, מצמידים listener אחד לאב ומשתמשים ב-bubbling כדי לזהות את היעד (event.target). זה יעיל יותר, עובד גם על אלמנטים שנוספו דינמית, ומקטין צריכת זיכרון.
מה ההבדל בין synchronous ל-asynchronous iteration?
for...of עובר על iterable סינכרוני. for await...of עובר על async iterable (למשל streams או קריאות API עוקבות) וממתין לכל ערך. שימושי לעיבוד נתונים שמגיעים בהדרגה בלי לטעון הכל לזיכרון.
מה זה readonly ו-as const ב-TypeScript?
readonly מונע שינוי של שדה אחרי אתחול. as const הופך literal לטיפוס הצר ביותר ובלתי-משתנה (למשל tuple קבוע). שניהם מחזקים אי-שינוי (immutability) ברמת הטיפוסים ומונעים באגים.
מתי לבחור במה — טבלת החלטות
שיקול דעת סביב טיפוסים ומבנים נבדק בראיון:
| הצורך | בחירה מומלצת | הסיבה |
|---|---|---|
| צורת אובייקט הניתנת להרחבה | interface | extends ו-merging |
| union/tuple/mapped type | type | גמישות רבה יותר |
| ערך "כל טיפוס" בטוח | unknown | מחייב narrowing |
| מידול state עם וריאנטים | discriminated union | narrowing ב-switch |
| קבוצת קבועים | union of literals | ללא קוד ריצה מיותר |
טעויות נפוצות בראיון
- בלבול בין == ל-===: לא להבין type coercion.
- אי-הבנה של this ב-arrow מול regular function: מקור באגים קלאסי.
- שימוש ב-any כפתרון לכל בעיה: מבטל את יתרון ה-TypeScript.
- לחשוב ש-const הופך אובייקט לבלתי-משתנה: הוא מונע רק השמה מחדש.
- התעלמות מ-null/undefined: מקור נפוץ ל-runtime errors.
מיני-צ'קליסט להכנה
- לתרגל closures, prototype, this ו-hoisting.
- להבין event loop ו-async/await לעומק.
- לדעת type מול interface, generics ו-narrowing.
- להכיר utility types ו-discriminated unions.
- להפעיל strict mode ולטפל ב-null/undefined נכון.
- להכין דוגמת debounce/throttle מהזיכרון.
לתפקידי frontend ראו את שאלות ראיון Frontend/React, ולתפקידי backend ב-JS את שאלות ראיון Backend. מוכנים? עיינו במשרות TypeScript, במשרות JavaScript, ובכלל המשרות הפתוחות.
שאלות נפוצות
כמה משרות JavaScript ו-TypeScript יש בישראל כרגע?
נכון להיום פתוחות אצלנו ב-HiTakeJob 44 משרות JavaScript ו-54 משרות TypeScript. שתי הטכנולוגיות מבוקשות ב-frontend, ב-full-stack וב-Node.js, ו-TypeScript הפך לסטנדרט בפרויקטים חדשים.
האם חייבים TypeScript או שמספיק JavaScript?
רוב הפרויקטים החדשים בישראל דורשים TypeScript, אך הוא בנוי על JavaScript — ולכן חובה לשלוט קודם ביסודות ה-JS (closures, this, async). מי ששולט ב-JS לומד את שכבת הטיפוסים במהירות.
על מה הכי שמים דגש בראיון?
על closures, prototype, this ואסינכרוניות ב-JavaScript; ועל type מול interface, generics, narrowing ו-utility types ב-TypeScript. מראיינים בודקים הבנה אמיתית, לא שינון הגדרות.
מה ההבדל המעשי בין any ל-unknown?
any מכבה לחלוטין את בדיקת הטיפוסים ומסוכן. unknown בטוח: מותר לקבל בו כל ערך, אך חובה לצמצם את הטיפוס (עם type guard) לפני שמשתמשים בו. עדיף unknown כמעט תמיד.
מה ההבדל בין ראיון לג'וניור לסניור?
לג'וניור: יסודות JS, טיפוסים בסיסיים ב-TS, וטיפול ב-null. לסניור: generics מתקדמים, discriminated unions, החלטות ארכיטקטורה סביב טיפוסים, ואסטרטגיית מיגרציה של קוד קיים ל-TypeScript.