Appearance
Detailed Scoring System (Keyword-Based)
👉 Rule: Each answer has key concepts (keywords).
- Candidate gets 1 point per keyword (unless noted otherwise).
- If they cover all keywords → full score.
- Partial answers get proportional points.
- Some questions will have a point for I don't know
JavaScript Core & Event Loop (25 points)
| Question | Max Points | Keywords (1 point each) |
|---|---|---|
| == vs === | 2 | == does type coercion, === strict equality, no coercion |
| Data types | 3 | Primitive, Non-primitive, Examples (string/number/object etc.) |
| var / let / const | 2 | Scope difference, Reassignment/Hoisting difference |
| null vs undefined | 2 | null = intentional empty, undefined = uninitialized |
| Arrow vs Normal function (this) | 3 | Normal = dynamic this, Arrow = lexical this, Example |
| Hoisting & Closures | 3 | Hoisting = declarations move up, Closure = inner function keeps outer scope, Example |
| ES6 updates | 2 | let/const, Arrow functions, Destructuring/Modules |
| Array cloning | 2 | slice(), [...arr], Array.from() |
| Looping objects | 2 | for...in, Object.keys/values/entries |
| Map vs forEach | 2 | map returns new array, forEach returns undefined |
| Event Loop example | 2 | Sync first, Microtasks (Promise), then Macrotasks (setTimeout) |
| What is the difference between == & === | 2 |
|---|---|
| does type coercion | 1 |
| strict equality, no coercion | 1 |
Senior-Level JavaScript (15 points)
| Walk me through a scenario where you optimized a complex grid with thousands of rows. | 10 |
|---|---|
| Virtual scrolling / infinite scroll | 1 |
| Pagination (client-side or server-side) | 1 |
| Server-side filtering and sorting | 1 |
| Column virtualization (render only visible columns) | 1 |
| Lazy loading of data chunks | 1 |
| OnPush change detection strategy | 1 |
| TrackBy in *ngFor for stable DOM reuse | 1 |
| Debouncing search/filter inputs | 1 |
| Caching frequently accessed data | 1 |
| Preloading lightweight summaries before full detail load | 1 |
| What is the difference between Default and OnPush change detection strategies? | 8 |
|---|---|
| Runs change detection for the entire component tree whenever any event occurs (click, HTTP response, timer, input, etc.) | 1 |
| Checks all components, even if their inputs didn’t change. | 1 |
| Easier for beginners, but less performant in large apps. | 1 |
| Runs change detection when : Component input reference changes | 1 |
| Runs change detection when : An event originates from inside the component | 1 |
| Runs change detection when : Or you manually trigger it (e.g., using `ChangeDetectorRef.markForCheck()`) | 1 |
| Skips re-checking components unnecessarily | 1 |
| More performant and predictable for ERP-scale applications. | 1 |
| Question | Max Points | Keywords |
|---|---|---|
| Browser request flow | 4 | DNS Lookup, TCP/HTTPS request, Server sends HTML/CSS/JS, Parsing & Rendering, JS executed (event loop) |
| Remove duplicates from array | 2 | Set, Filter + indexOf |
| call vs apply vs bind | 3 | call(args list), apply(args array), bind returns new function |
| Tree shaking | 3 | Remove unused code, ES modules, Reduce bundle size |
| Web Vitals | 3 | LCP, FID, CLS, Measure performance & UX |
Angular (35 points)
| Question | Max Points | Keywords |
|---|---|---|
| Angular & building blocks | 3 | Modules, Components, Services, Templates, Metadata |
| Lifecycle hooks | 3 | ngOnInit, ngOnChanges, ngOnDestroy |
| Directives & Pipes | 3 | Structural, Attribute, Built-in Pipes, Custom |
| Promise vs Observable | 3 | Promise = single value, Observable = stream/multiple, cancellable |
| Change Detection (deep) | 5 | Zone.js triggers, Component tree re-check, Default strategy, OnPush strategy |
| Signals & difference | 5 | Fine-grained reactivity, No Zone.js, Automatic change tracking, More performant |
| Encapsulation | 2 | Emulated, ShadowDom, None |
| Dependency Injection | 3 | Injector provides, Singleton pattern, Hierarchical injectors |
| Service vs Class | 2 | Service managed by DI, Class instantiated manually |
| Provided in root vs module | 2 | Root = singleton app-wide, Module = new instance per module |
| Interceptor | 2 | Intercept HTTP requests/responses, Auth/logging/error handling |
| Guard | 2 | CanActivate/Deactivate, Route protection |
| Resolver | 2 | Pre-fetch data before routing |
| Compilation types | 2 | JIT (runtime), AOT (build time) |
| Authentication vs Authorization | 2 | Auth = identity, Authorization = permissions |
Performance Optimization (10 points)
| Question | Max Points | Keywords |
|---|---|---|
| Angular optimization strategies | 10 | OnPush, trackBy, Lazy Loading, Preloading, Signals, Tree Shaking, Build Optimizer, Lazy loading images, Web Workers, Caching, SSR |
Live Coding (15 points)
| Exercise | Max Points | Keywords |
|---|---|---|
| Reverse string | 2 | split, reverse, join |
| Remove duplicates | 2 | Set, filter |
| Find max number | 2 | Math.max, Spread operator |
| FizzBuzz | 2 | %3, %5, Output "Fizz", "Buzz", "FizzBuzz" |
| Debounce function | 3 | Clear timeout, Set timeout, Return wrapper function |
| Deep clone object | 2 | structuredClone, JSON.parse(JSON.stringify(obj)) |
| Angular trackBy | 2 | trackByFn, Return unique id, Performance benefit |
Scoring Guidelines
- ✅ Mention all keywords → full score.
- ⚠️ Mention some keywords → partial score.
- ❌ No relevant keywords → 0 score.
Rating Scale
- 85–100: Strong Senior
- 70–84: Mid-Senior
- 50–69: Mid-Level
- <50: Junior