- Published on
Notes on Advanced JavaScript
- Authors

- Name
- Rakesh Tembhurne
- @tembhurnerakesh
Frames and Windows
- Popups and Window Methods:
window.open(url, [name], [specs], [replace]): Opens a new browser window or tab.url: URL to load.name: Target name (e.g.,_blank,_self, or custom name for specific window).specs: Comma-separated list of features (width, height, toolbar, menubar, etc.).
window.close(): Closes the current window/tab. Only works for windows opened bywindow.open().window.postMessage(message, targetOrigin): Sends a message to another window (see Cross-window communication).window.opener: Reference to the window that opened the current window.popup.focus(): Brings the popup window to the foreground.
- Cross-Window Communication:
- Same-Origin Policy: A security measure. Scripts from one origin (protocol + host + port) cannot access content from another origin.
window.postMessage(): The standard and safest way to communicate between windows/frames from different origins.- Sends
messageto a target window (e.g.,window.opener,iframe.contentWindow). targetOrigin: String specifying origin (e.g.,'https://example.com') or'*'(any origin). Crucial for security; always specify the exact origin if known.- Event listener on receiving side:
window.addEventListener('message', handler).handler.datacontains the message,handler.origincontains sender's origin.
- Sends
- Same-Origin Access: If windows/frames are from the same origin:
- Direct access:
iframe.contentWindow.document,popup.document. - Direct function calls:
iframe.contentWindow.someFunction(). - Parent/Child access:
window.parent,iframe.contentWindow,window.frames[index/name].
- Direct access:
- The Clickjacking Attack:
- A malicious technique where a user is tricked into clicking on something different from what they perceive, typically by overlaying an invisible or opaque layer over a legitimate webpage.
- Often involves an
<iframe>set withopacity: 0or positioned off-screen, with a malicious page behind it. - Defense:
X-Frame-OptionsHTTP header:DENY,SAMEORIGIN,ALLOW-FROM uri. Prevents embedding your page in<iframe>s.- Content Security Policy (CSP)
frame-ancestorsdirective: More flexible and powerful thanX-Frame-Options.
Binary Data, Files
- ArrayBuffer, Binary Arrays:
ArrayBuffer: A raw binary data buffer. Stores a fixed number of bytes, but no direct methods to manipulate contents.new ArrayBuffer(length).TypedArray(Views): Provides methods to read/writeArrayBuffercontents as specific data types (e.g.,Uint8Array,Int32Array,Float64Array).new Uint8Array(buffer, [byteOffset], [length]): View of 8-bit unsigned integers.- Views don't store data themselves; they are "windows" into an
ArrayBuffer.
DataView: A more flexible view for mixed data types and byte order, allowing arbitrary offset access.new DataView(buffer, [byteOffset], [byteLength]).- Methods:
dataView.getUint8(offset),dataView.getFloat64(offset, littleEndian).
- Use Cases: Manipulating raw image data, audio processing, WebSockets (binary frames), WebAssembly.
- TextDecoder and TextEncoder:
TextEncoder: Converts strings (UTF-8) intoUint8Array.new TextEncoder().encode(string): ReturnsUint8Arrayof UTF-8 bytes.
TextDecoder: ConvertsUint8Arraybytes into strings (UTF-8 by default, supports other encodings).new TextDecoder([encoding], [options]).decoder.decode(uint8Array): Returns string.
- Use Cases: Working with network protocols, file manipulation, where data is typically byte-encoded.
- Blob:
Blob(Binary Large Object): Represents immutable raw data. Can contain any type of data, not necessarily JavaScript-native binary formats.new Blob(array, [options]): Creates a Blob.arraycan containArrayBuffer,TypedArray,Blob, strings.options.typesets MIME type.- Use Cases:
- Downloading generated content (e.g.,
<a>taghrefwithURL.createObjectURL(blob)). - Uploading data via
fetchorXMLHttpRequest(FormData). - Slicing large files:
blob.slice(start, end, [contentType]). Blobobjects can be easily converted to text usingFileReader.
- Downloading generated content (e.g.,
- File and FileReader:
File: A specific type ofBlobwith additional properties likenameandlastModifiedDate.Fileobjects are typically obtained from user input (e.g.,<input type="file">filesproperty) or drag-and-drop.FileReader: An API to asynchronously read the contents ofFileorBlobobjects into memory.new FileReader(): Creates a reader.- Methods:
reader.readAsText(blob, [encoding]): Reads as text.reader.readAsArrayBuffer(blob): Reads asArrayBuffer.reader.readAsDataURL(blob): Reads as base64 encoded string (data URL).
- Events:
reader.onload(on successful read),reader.onerror(on error),reader.onprogress. reader.result: Contains the result of the read operation.
- Use Cases: Displaying image previews, client-side file parsing, client-side encryption/compression.
Network Requests
- Fetch API:
- A modern, promise-based API for making network requests. Replaces
XMLHttpRequestfor most use cases. fetch(url, [options]): Returns aPromisethat resolves to aResponseobject.Responseobject: Represents the response from the server.- Properties:
response.ok,response.status,response.headers. - Methods (to parse body):
response.json(),response.text(),response.blob(),response.arrayBuffer(),response.formData(). All return Promises.
- Properties:
- Request Options:
method: HTTP method ('GET','POST', etc.).headers: HTTP headers (e.g.,{'Content-Type': 'application/json'}).body: Request body (e.g.,JSON.stringify(data),FormData,Blob,URLSearchParams).mode: Request mode ('cors','no-cors','same-origin').credentials: Cookie/HTTP authentication handling ('omit','same-origin','include').cache: Cache mode ('default','no-store', etc.).signal:AbortSignalfor aborting requests.
- A modern, promise-based API for making network requests. Replaces
- FormData:
- An object that allows you to construct a set of key/value pairs representing form fields, primarily for sending data with
fetchorXMLHttpRequestviamultipart/form-dataencoding. new FormData([formElement]): CreatesFormDatafrom an existing<form>or an empty one.formData.append(name, value, [filename]): Adds a new field.valuecan be a string,Blob, orFile.formData.get(name),formData.getAll(name),formData.has(name),formData.delete(name).- Automatically sets
Content-Type: multipart/form-dataheader when sent viafetch.
- An object that allows you to construct a set of key/value pairs representing form fields, primarily for sending data with
- Fetch: Download Progress:
- Requires working with
response.bodyas aReadableStream. - Read chunks using
response.body.getReader(). - Track
loadedBytesagainstresponse.headers.get('Content-Length'). - More complex than simple
XMLHttpRequestprogress events.
- Requires working with
- Fetch: Abort:
- Uses
AbortControllerandAbortSignal. const controller = new AbortController();const signal = controller.signal;fetch(url, { signal });controller.abort();(to cancel the request).- The
fetchPromise will reject with anAbortError.
- Uses
- Fetch: Cross-Origin Requests:
- By default,
fetchoperates under the Same-Origin Policy. mode: 'cors'(default for requests to other origins): Allows cross-origin requests, subject to CORS headers from the server.credentials: 'include': Sends cookies and HTTP authentication with cross-origin requests (requiresAccess-Control-Allow-Credentials: truefrom server).
- By default,
- URL Objects:
new URL(url, [base]): Creates aURLobject for parsing and manipulating URLs.- Properties:
href,protocol,host,hostname,port,pathname,search,hash,username,password. URLSearchParamsviaurl.searchParams: Methods to manage query parameters (e.g.,append,delete,get,set).- Use Cases: Building complex URLs, parsing incoming URLs, safely encoding query parameters.
- XMLHttpRequest (XHR):
- The older API for making HTTP requests. Event-based.
new XMLHttpRequest()xhr.open(method, url, [async], [user], [password])xhr.send([body])- Events:
xhr.onload,xhr.onerror,xhr.onprogress(for upload/download progress),xhr.onreadystatechange. xhr.responseType:'json','text','blob','arraybuffer','document'.xhr.status,xhr.statusText,xhr.response.- Still relevant for: file upload progress (simpler than Fetch), older codebases, specific browser features not yet in Fetch.
- Resumable File Upload:
- Breaking large files into smaller chunks (
Blob.slice()). - Uploading chunks sequentially or in parallel.
- Maintaining upload state (which chunks sent) on client and server.
- If upload is interrupted, can resume from the last successfully sent chunk.
- Commonly implemented with XHR progress events or Fetch with custom stream readers.
- Breaking large files into smaller chunks (
- Long Polling:
- Client sends a request to the server, and the server holds the connection open until new data is available or a timeout occurs.
- Once data is sent (or timeout), the connection closes, and the client immediately opens a new request.
- Drawbacks: High overhead (many connections), potential for delays if server is slow.
- Alternative: WebSockets, Server-Sent Events.
- WebSocket:
- Provides a full-duplex (two-way) communication channel over a single, long-lived TCP connection.
new WebSocket(url, [protocols]): Connects to a WebSocket server (ws://orwss://protocol).- Events:
ws.onopen,ws.onmessage,ws.onclose,ws.onerror. - Methods:
ws.send(data),ws.close([code], [reason]). - Benefits: Low overhead, real-time communication, ideal for chat, gaming, live updates.
- Server Sent Events (SSE):
- A unidirectional (server-to-client only) event streaming protocol built on top of HTTP.
new EventSource(url): Connects to an SSE endpoint.- Server sends events in a specific
text/event-streamformat. - Events:
source.onopen,source.onmessage,source.onerror. Can also listen for custom event names sent by server:source.addEventListener('customEvent', handler). - Automatically reconnects on connection loss.
- Benefits: Simpler than WebSockets for server-push only scenarios (e.g., stock tickers, news feeds), leverages HTTP.
Storing Data in the Browser
- Cookies,
document.cookie:- Small strings of data stored by the browser, sent with every HTTP request to the same domain.
document.cookie: A getter/setter that returns/sets the entire cookie string.- Properties:
name=value,expires,max-age,path,domain,secure,HttpOnly,SameSite. - Limitations: Small size (approx. 4KB per domain), sent with every request (performance overhead), primarily for server-side state management (sessions, authentication).
- LocalStorage, SessionStorage:
- Web Storage API: Key-value pairs storage in the browser.
localStorage: Stores data with no expiration time. Data persists even after browser restart.sessionStorage: Stores data only for the duration of the browser session (until the tab/window is closed).- Methods:
storage.setItem(key, value): Storesvalue(string).storage.getItem(key): Retrievesvalue(string).storage.removeItem(key): Removeskey.storage.clear(): Clears all items.storage.length: Number of items.
- Limitations: Stores only strings (must
JSON.stringify/parseobjects), synchronous (can block main thread for large data), domain-specific (Same-Origin Policy applies), size limit (typically 5-10MB). - Use Cases: Client-side caching, user preferences, offline data.
- IndexedDB:
- A low-level API for client-side storage of significant amounts of structured data, including files/blobs.
- Key Concepts:
- Database:
IDBDatabase(multiple per origin). - Object Store: Like tables, store records.
- Key: Unique identifier for each record.
- Index: For fast lookups on non-key properties.
- Transaction: All operations must be inside a transaction (
IDBTransaction). Atomic. - Request: Most operations return
IDBRequestobjects, which firesuccessorerrorevents.
- Database:
- Asynchronous: All operations are non-blocking, using events or Promises (with wrapper libraries).
- Use Cases: Offline web applications, large client-side data storage, caching complex data structures.
- Complexity: More complex API than Web Storage, often used with helper libraries (e.g.,
localforage).
Animation
- Bezier Curve:
- A mathematical curve used to define smooth paths and easing functions in animations.
- Defined by control points:
P0(start),P1,P2, ...Pn(end). - Cubic Bezier (
cubic-bezier(x1, y1, x2, y2)): Common in CSStransition-timing-functionandanimation-timing-function, defining the speed curve of an animation.linear,ease,ease-in,ease-out,ease-in-outare pre-defined Bezier curves.
- CSS-Animations:
- Declarative animation using CSS properties.
transition: Animates changes in CSS properties over a specified duration.transition-property,transition-duration,transition-timing-function(Bezier),transition-delay.
animation: More powerful, allows complex multi-step animations (keyframes).@keyframes: Defines animation steps.animation-name,animation-duration,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,animation-fill-mode.
- Benefits: Hardware-accelerated (often smooth), simpler for many UI effects, separates concerns (style in CSS).
- Limitations: Less control over complex logic, interaction, or precise timing than JavaScript.
- JavaScript Animations:
- Programmatic animation using
requestAnimationFrame. requestAnimationFrame(callback): Schedules a function to run before the browser's next repaint. Optimized for smooth animations.- Process:
- Define animation state (e.g., current position, progress).
requestAnimationFrameloop: In each frame, update state based on elapsed time, apply changes to DOM (e.g.,elem.style.left = ...), and schedule next frame.- Stop loop when animation finishes.
- Benefits: Fine-grained control, can animate any property, easily integrate with user interaction, complex physics or interpolated values.
- Limitations: More code, can be less performant if not optimized (e.g., forcing reflows), requires careful
requestAnimationFramemanagement. - Web Animations API (WAAPI): A newer API aiming to bridge CSS and JS animations, providing a JS interface for animating DOM elements efficiently.
elem.animate().
- Programmatic animation using
Web Components
- From the Orbital Height: A set of standards allowing developers to create reusable custom HTML elements with encapsulated functionality and styling.
- Custom Elements:
CustomElementRegistry.define(tagName, constructor, [options]): Registers a new custom element.tagName: Must contain a hyphen (e.g.,'my-element').constructor: ES6 class extendingHTMLElement.
- Lifecycle Callbacks: Special methods called at different stages of an element's life:
connectedCallback: When element is added to DOM.disconnectedCallback: When element is removed from DOM.adoptedCallback: When element is moved to a new document.attributeChangedCallback(name, oldValue, newValue): When an observed attribute changes.
static observedAttributes: Array of attribute names to observe.
- Shadow DOM:
- A way to encapsulate a component's internal DOM structure and styling.
elem.attachShadow({ mode: 'open' | 'closed' }): Attaches a shadow root to an element.- Content inside the shadow root is separate from the main document's DOM.
- Encapsulation:
- CSS inside Shadow DOM only applies to its own content.
- CSS from main document generally does not penetrate Shadow DOM (except inherited properties).
- IDs and classes inside Shadow DOM do not conflict with IDs/classes in the main document.
- Use Cases: Reusable UI widgets, ensuring consistent styling, preventing style conflicts.
- Template Element:
<template>: Holds HTML content that is not rendered when the page loads. It's a dormant DOM fragment.template.content: Returns aDocumentFragmentcontaining the template's content.- Use Cases: Defining reusable blocks of HTML that can be cloned and inserted into the DOM (especially with Custom Elements and Shadow DOM).
- Shadow DOM Slots, Composition:
<slot>: A placeholder element inside Shadow DOM. It defines where children from the light DOM (main document) will be rendered.named slots:<slot name="foo">allows specific light DOM children (e.g.,<span slot="foo">) to be projected into specific slots.- Composition: The process of rendering content from the light DOM into the Shadow DOM via slots. This allows the component's internal structure to combine with user-provided content.
- Shadow DOM Styling:
- Default: Styles defined within the Shadow DOM are scoped to it.
- Inherited properties: Some CSS properties (e.g.,
font-size,color) inherit from the main document into the Shadow DOM. ::part()pseudo-element: Allows main document CSS to style specific, exposed parts of a Shadow DOM component (<div part="button">). Component author must explicitly declare parts.- CSS Custom Properties (Variables): Can be used to customize Shadow DOM styles from the outside (
--my-color: red;). ::slotted()pseudo-element: Styles content within a slot.
- Shadow DOM and Events:
- Events originating from inside Shadow DOM typically re-target to the host element when bubbling up to the light DOM.
event.target: Will be the host element (or a slot if a slot is the actual target).event.composedPath(): Returns an array of DOM nodes through which the event propagated, showing the true path across Shadow DOM boundaries.event.composed:trueif the event can bubble out of the Shadow DOM.
Regular Expressions
- Patterns and Flags:
- RegExp Literals:
/pattern/flags(e.g.,/abc/i). - RegExp Constructor:
new RegExp('pattern', 'flags')(e.g.,new RegExp('abc', 'i')). Useful for dynamic patterns. - Flags:
i(case-insensitive): Ignores case.g(global): Finds all matches, not just the first.m(multiline):^and$match start/end of lines, not just start/end of string.u(unicode): Enables full Unicode support (e.g., for surrogate pairs,\p{...}).s(dotAll):.matches all characters, including newlines (\n).y(sticky): Matches only from the current position (specified bylastIndex).
- RegExp Literals:
- Character Classes:
\d: Digit (0-9).\D: Non-digit.\s: Whitespace character (space, tab, newline, etc.).\S: Non-whitespace.\w: Word character (alphanumeric + underscore:a-zA-Z0-9_).\W: Non-word character..: Any character (except newline, unlesssflag is used).
- Unicode: Flag
"u"and Class\p{...}:uflag: Essential for correct handling of Unicode characters outside the BMP (surrogate pairs). Withoutu,.might match half a surrogate pair, and\wmight not match all letters.\p{UnicodeProperty}(withuflag): Matches characters with a specific Unicode property. E.g.,\p{L}(any Unicode letter),\p{N}(any Unicode number),\p{Script=Cyrillic}.
- Anchors: String Start
^and End$:^: Matches the beginning of the input string.$: Matches the end of the input string.
- Multiline Mode of Anchors
^ $, Flag"m":- With
mflag,^matches the start of a line (after\nor string start). - With
mflag,$matches the end of a line (before\nor string end). - Without
m,^and$only match the absolute start and end of the entire string.
- With
- Word Boundary:
\b:- Matches a position where a word character (
\w) is not followed by a word character, or vice-versa. Effectively, the boundary between\wand\W(or string start/end). - Example:
/\bcat\b/matches "cat" in "The cat sat", but not in "catapult". \B: Non-word boundary.
- Matches a position where a word character (
- Escaping, Special Characters:
- Special characters in regex have specific meanings:
[] {} () \ . ^ $ * + ? |. - To match them literally, escape them with a backslash:
\.,\+,\(, etc. - Backslash
\itself needs to be escaped in string literals (e.g.,new RegExp('\\.')).
- Special characters in regex have specific meanings:
- Sets and Ranges
[...]:[abc]: Matches any single character from the seta,b, orc.[a-z]: Matches any single character in the rangeatoz.[0-9A-Za-z]: Matches any alphanumeric character.[^abc]: Matches any single character not in the seta,b, orc. (Negated character set).
- Quantifiers
+,*,?and{n}:+: One or more times (e.g.,a+matches "a", "aa", "aaa").*: Zero or more times (e.g.,a*matches "", "a", "aa", "aaa").?: Zero or one time (e.g.,a?matches "" or "a").{n}: Exactlyntimes (e.g.,a{3}matches "aaa").{n,}:nor more times (e.g.,a{3,}matches "aaa", "aaaa").{n,m}: Betweennandmtimes, inclusive (e.g.,a{3,5}matches "aaa", "aaaa", "aaaaa").
- Greedy and Lazy Quantifiers:
- Greedy (default): Quantifiers try to match the longest possible string. (e.g.,
.*in<a> ... </a>matches everything between first<a>and last</a>). - Lazy (non-greedy): Add
?after the quantifier (e.g.,+?,*?,??,{n,}?,{n,m}?). They try to match the shortest possible string. - Example:
<.*?>in<p><b>Hello</b> <i>World</i></p>matches<b>Hello</b>instead of the entire string.
- Greedy (default): Quantifiers try to match the longest possible string. (e.g.,
- Capturing Groups:
(pattern): Groups parts of a pattern. The matched content of a capturing group can be accessed later.- Numbered groups:
(1),(2), etc., based on their order. - Named groups:
(?<name>pattern)(e.g.,(?<year>\d{4})). Access viamatch.groups.name. - Non-capturing groups:
(?:pattern). Groups for matching but don't capture content.
- Backreferences in Pattern:
\Nand\k<name>:\N: Matches the content previously captured by the N-th capturing group (e.g.,(a)\1matches "aa").\k<name>: Matches the content previously captured by the named groupname(e.g.,(?<word>\w+)\k<word>).
- Alternation (OR)
|:pattern1|pattern2: Matches eitherpattern1orpattern2.- Parentheses are often used to group alternatives:
(cat|dog)smatches "cats" or "dogs".
- Lookahead and Lookbehind:
- Lookahead (
(?=...),(?!...)): Matches a position (zero-width assertion) where a pattern is (positive lookahead) or is not (negative lookahead) followed by another pattern.x(?=y): Matchesxonly ifxis followed byy.x(?!y): Matchesxonly ifxis not followed byy.
- Lookbehind (
(?<=...),(?<!...)): Matches a position where a pattern is (positive lookbehind) or is not (negative lookbehind) preceded by another pattern. (Requires ES2018+ support).(?<=y)x: Matchesxonly ifxis preceded byy.(?<!y)x: Matchesxonly ifxis not preceded byy.
- Use Cases: Complex validation, parsing where context is important but not part of the match.
- Lookahead (
- Catastrophic Backtracking:
- A performance issue where a regex engine takes an extremely long time to evaluate a pattern, often due to ambiguous quantifiers, nested quantifiers, or greedy matching.
- Example:
(a+)+strying to matchaaaaaaaaaaaaaaaaaaax. The(a+)+has many ways to splitas, causing the engine to backtrack excessively. - Prevention: Use lazy quantifiers, possessive quantifiers (not in JS), rephrase patterns to reduce ambiguity, avoid nested quantifiers.
- Sticky Flag
"y", Searching at Position:y(sticky) flag: Ensures the regex only matches from the position indicated bylastIndexproperty of theRegExpobject.regex.exec(string): Whenyflag is set,execwill only match if the match starts exactly atregex.lastIndex. If a match is found,lastIndexis updated to the end of the match. If no match,lastIndexis reset to 0.- Use Cases: Parsing string data in chunks, sequential tokenizing.
- Methods of RegExp and String:
RegExpmethods:regex.test(string): Returnstrueifregexfinds a match instring,falseotherwise.regex.exec(string): Returns an array with match info ([fullMatch, group1, ...]) and properties (index,input,groups), ornullif no match. Useful for iterating withgoryflags.
Stringmethods (that use RegExp):str.match(regex):- If
gflag: Returns an array of all full matches. - No
gflag: Returns array likeregex.exec().
- If
str.matchAll(regex): Returns an iterator for all matches, including capturing groups. Requiresgflag.str.search(regex): Returns the index of the first match, or-1. Ignoresgflag.str.replace(regex, replacement): Replaces matches.replacementcan be a string or a function.str.split(regex): Splits a string byregexpattern.
Related Posts
Notes on Browser JavaScript
JavaScript in the browser is a dynamic and interactive programming language that runs in web browsers and other software applications that use the JavaScript engine.
Notes on JavaScript
Notes on JavaScript, a versatile programming language widely used for web development.