Post
Front End Interview Dictionary

JavaScript Fundamental
Variable storing
var | let | const |
function scoped | block scoped | block scoped |
can be redeclared | can’t be redeclared | can’t be redeclared |
can be reassigned | can be reassigned | can’t be reassigned |
can be empty when init | can be empty when init | can’t be empty when init |
accessing before declaration become undefined | accessing before declaration become ReferenceError | accessing before declaration become ReferenceError |
added to window object if declared in global scope | ㅤ | ㅤ |
Debounce vs Throttling
Debounce | Throttling |
delay the execution of event until certain amount of time passed | limit rate of event within a certain timeframe |
for handling event that have pause (e.g. typing) | for handling continuous event (e.g. scrolling) |
Browser Storage
localStorage | sessionStorage | Cookie |
only client can use | only client can use | client or server ( Set-Cookie) can use |
until deleted | until tab closed | until specified time |
5MB | 5MB | 4kb |
same-origin | same-origin | same-origin |
ㅤ | only persistent on current tab | sent to server for every http request |
Real-time Communication
WebSocket | EventSource (server-sent events) |
WebSocket protocol (ws://) | HTTP protocol (http://) |
Two-way (client ↔ server) | One-way (client ← server) |
Text and binary | Text |
Testing
- Unit testing: function or component
- Integration testing: module or service
- End-to-end testing: entire flow
Worker
- background thread that allow us to run JS in background parallel with main thread
- 3 types:
- web worker
- run script in background
- use case: heavy computation, data processing
- service worker
- network proxies between network and our web
- use case: enable offline functionality, caching, push notification
- shared worker
- sharing between window or frame (must same domain)
- use case: coordinating task between component in our web
this
value of
this in regular function (function() {}) refer to based on how they being called:- top level function: the global object (window / undefined)
function printThis() { console.log(this) } printThis() // window object if run browser, undefined in NodeJS
- called as a method of object: the object itself
const obj = { printThis: function() { console.log(this) } // Also same with this syntax printThis() { console.log(this } } obj.printThis() // Object { printThis: f }
- using apply / call / bind: the passed object
const obj = { number: 1, printThis: function() { console.log(this) } } obj.printThis.bind({ number: 2 })() // Object { number: 2 }
- in constructor: the newly created object
function Person() { this.name = "person" console.log(this) // Object { name: "person" } } class Animal { constructor() { this.species = "cat"; console.log(this) // Object { species: "cat" } } }
- DOM event listener: the element object
document.getElementById("button").addEventListener("click", function() { console.log(this) // "button" element })
Closure
Closure: a function that still have access to it's lexical scope when he defined
Lexical scope: it's own scope & scope of it's parent function
Benefit: to hide the implementation details and maintaining state in encapsulation
Hosting
Hoisting: mechanism where variable and function declaration are moved to the top of their containing scope during compile phaseIf we try
console.log the value, based on their variable type- var:
undefined
- let & const:
ReferenceError(Temporal Dead Zone)
- function expression & arrow function: depends on their variable type
- function declaration (
function (){}): can be called
Promise
Promise.all | Promise.allSettled |
accept array of Promise | accept array of Promise |
resolve when all resolved, reject when any rejected | resolve when all resolved or rejected |
return array of Promise value | return array of { status: 'fulfilled', value: any } or { status: 'rejected', reason: any } |
Event Loop
Event loop: mechanism how JS handle async operation.There are 4 world: call stack, Web API/NodeJS API, macrotask queue, microtask queue.
JS will prioritize executing microtask (promise, await) → macrotask (Web API/NodeJS API, listener)

Good video: https://www.youtube.com/watch?v=eiC58R16hb8
React
Reconciliation
- React mechanism to prevent expensive DOM tree rebuild
- React keep lightweight version of UI in memory called virtual DOM
- Two phase:
- render, when state or props changes, React rebuild the virtual DOM and compare to existing on
- the diffing algorithm
- different element → rebuild
- same type → keep what same
- list matched by key → if the key is changed then also rebuild
- commit, apply only what change to real DOM
Strict Mode
In
Strict Mode, React will call some of your functions twice instead of once- React uses the result of one of the calls, and ignores the result of the other call
In JavaScript, a
function () {} or () => {} always creates a different function, similar to how the {} object literal always creates a new object.
That means passing them as props (without useCallback), will make the child component re-render (even though child component wrapped by React.memo)React hooks
React.memo- for component
- background: child component re-render when it’s parent re-render or when it’s props changed
- use case:
- when we want component to be re-render only when it’s props changed
useMemo- for value
- dependencies comparison with
Object.is
- use case:
- skip expensive calculation
- prevent re-render by memoized the value that will be send as props
- prevent useEffect to firing more often if the value is dependency of useEffect
useCallback - for function
- dependencies comparison with
Object.is
- use case:
- avoid writing extra nested function if using useMemo to wrap function
- prevent re-render by memoized the function that will be send as props
- prevent useEffect to firing more often if the function is dependency of useEffect
React Compiler automatically memoizes values and functions, reducing the need for manual
useMemo calls.useEffect | useLayoutEffect |
runs after paint | runs before paint, after DOM update |
async, non-blocking | sync, blocking, delays paint until effect complete |
when we don't need to interact with DOM or DOM changes are unobservable | when need to mutate DOM or perform measurements |
useId- use case:
- generate id for accessibility, e.g: htmlFor, aria-describedby
- generate id for components that rendered multiple times
useRef- use case:
- when we want to store value that’s when changed not resulted in rerendering e.g. form data, interval id
- manipulating the DOM
Next.js
app router | pages router |
Each file in /pages become route | Each file in /app/[page]/page.tsx become route |
getStaticProps and getStaticPaths (SSG), getServerSideProps (SSR) | RSC by default, use fetch directly |
no built in nested layout, use _app.js or _document.js | have layout and template |
layout | template |
UI to wrap pages | UI to wrap pages |
persistent | remounted every time the page changed |
Server Side Rendering (SSR)
- generate the page on the server then send it to client
- need server
Static Side Generation (SSG)
- generate whole static routes initially
- don’t need server
Client Side Rendering (CSR)
- browser downloads a minimal HTML page and renders the content using JavaScript
- don’t need server
Increment Static Regeneration (ISG)
- regenerate only certain page instead of whole static routes
- need server
Hydration
- process that happened after the server-side rendered HTML is sent to client
- process of attaching event listener and initialize state on server rendered HTML page to make the page interactive
Performance
Terbagi 2:
- Load: lazy loading (page, component), CDN, caching, use small size package, image (lazy loading, compress, responsive)
- Rendering: memoization, virtualization, prevent rerendering
SEO
- <meta> tag
- robots.txt
- sitemap.xml
- Structured data
CSS
CSS specificity
- inline
- id
- class (and pseudo class)
- attribute
- element (and pseudo element)
Layout thrashing
- read and write DOM repeatedly
- to prevent:
- batch the DOM changes
- use
documentFragment
Reflow and repaint
- repaint: changes made to element but not affect layout
- e.g updating color, background, etc
- reflow: changes made to element and affect layout
- e.g. adding or removing element; updating: width, height, etc
- to prevent:
- use css class for style change instead of via js
- use
requestAnimationFrameto sync the animation with browser repaint cycle - use
will-changefor frequently changing elements - avoid layout thrashing
Not important, but might need to know
← open
falsy values:
- boolean
false
- empty string
“”
- number
0(0, -0, +0)
undefined
NaN
null
document.all
Object.freeze | Object.seal | Object.preventExtensions |
property can’t be added | property can’t be added | property can’t be added |
property can’t be modified | property can be modified | property can be modified |
property can’t be deleted | property can’t be deleted | property can be deleted |
check using Object.isFrozen() | check using Object.isSealed() | check using Object.isExtensible() |
shallow | shallow | shallow |
Object.is basically same with === except in treating 0 and NaN
Class
when creating new object with
new Class(), what happened:- creating new object
- set the prototype
- set
thisto newly created object
- return newly created object
mouseenter: doesn't bubbling in descendant
mouseover: bubbling in descendantto help visualize: imagine you can see through a house from top which you can always observe all from OVER, meanwhile when you ENTER you can only see what room you are currently
Found this post helpful? Share it with others.