Mid JavaScript

Newer ES features (ES7–ES14): ● includes(), ** (ES7) ● async/await, Object.entries() (ES8) ● Object rest/spread, Promise.finally (ES9) ● Array.flat(), Object.fromEntries() (ES10) ● BigInt, ?

?, ?. (ES11)

  • replaceAll(), Promise.any() (ES12)
  • at(), top-level await (ES13)
  • Array.findLast(), findLastIndex() (ES14+)

🔹 76. includes() method for arrays (ES7)

Checks if an array contains a specific element and returns true or

false.

const fruits = ["apple", "banana", "mango"];

console.log(fruits.includes("banana")); // true

console.log(fruits.includes("grapes")); // false

🔹 77. Exponentiation operator ** (ES7)

Raises the left operand to the power of the right operand.

console.log(2 ** 3); // 8

console.log(5 ** 2); // 25

🔹 78. async/await (ES8)

Definition: Syntactic sugar over Promises to write asynchronous code

like synchronous code.

Example:

async function fetchData() {

try {

const response = await fetch("

const data = await response.json();

console.log(data);

} catch (err) {

console.error(err);

fetchData();

Notes:

  • async marks a function as asynchronous and it returns a

Promise.

  • await pauses the function until the Promise resolves or

rejects.

🔹 79. Object.entries() and Object.values() (ES8)

Object.entries(obj) – Returns an array of [key, value] pairs.

const user = {name: "Sandeep", age: 30};

console.log(Object.entries(user));

// [["name", "Sandeep"], ["age", 30]]

Object.values(obj) – Returns an array of values.

console.log(Object.values(user));

// ["Sandeep", 30]

🔹 80. String.padStart() and String.padEnd() (ES8)

padStart(targetLength, padString) – Pads the start of a string to

reach a desired length.

const str = "5";

console.log(str.padStart(3, "0")); // "005"

padEnd(targetLength, padString) – Pads the end of a string.

console.log(str.padEnd(3, "*")); // "5**"

🔹 81. Rest/Spread for objects (ES9)

Rest operator {...rest} collects remaining properties into a new object.

Spread operator {...obj} copies properties from one object to another.

Example – Rest:

const {a, b, ...rest} = {a:1, b:2, c:3, d:4};

console.log(rest); // {c: 3, d: 4}

Example – Spread:

const obj1 = {x:1, y:2};

const obj2 = {...obj1, z:3};

console.log(obj2); // {x:1, y:2, z:3}

🔹 82. Promise.finally() (ES9)

Runs a callback after a Promise is settled, regardless of success or failure.

Example:

fetch('/api/data')

.then(res => res.json())

.catch(err => console.error(err))

.finally(() => console.log('Fetch attempt finished'));

🔹 83. Asynchronous iterators (ES9)

Allow iterating over asynchronous data streams using for await...of.

Example:

async function* asyncGenerator() {

yield await Promise.resolve(1);

yield await Promise.resolve(2);

yield await Promise.resolve(3);

(async () => {

for await (const num of asyncGenerator()) {

console.log(num);

})();

// Output: 1, 2, 3

🔹 84. Array.flat() and Array.flatMap() (ES10)

Array.flat(depth) – Flattens nested arrays up to the specified depth.

Example:

const arr = [1, [2, [3, 4]]];

console.log(arr.flat(1)); // [1, 2, [3, 4]]

console.log(arr.flat(2)); // [1, 2, 3, 4]

Array.flatMap() – Maps each element and flattens the result by one level.

Example:

const arr = [1, 2, 3];

const result = arr.flatMap(x => [x, x*2]);

console.log(result); // [1, 2, 2, 4, 3, 6]

🔹 85. Object.fromEntries() (ES10)

Converts an array of key-value pairs into an object.

Example:

const entries = [['name', 'Sandeep'], ['age', 30]];

const obj = Object.fromEntries(entries);

console.log(obj); // {name: "Sandeep", age: 30}

🔹 86. Optional catch binding (ES10)

Allows omitting the error parameter in catch if it’s not needed.

Example:

try {

throw new Error("Oops");

} catch {

console.log("Error handled without using the error object");

🔹 87. BigInt (ES11 / 2020)

Represents integers larger than Number.MAX_SAFE_INTEGER.

Example:

const bigNumber = 123456789012345678901234567890n;

console.log(bigNumber + 1n); // 123456789012345678901234567891n

Notes:

  • Use n at the end to denote a BigInt literal.
  • Cannot mix Number and BigInt directly in arithmetic.

🔹 88. Nullish coalescing operator ?? (ES11 / 2020)

Returns the right-hand side value only if the left-hand side is null or undefined.

Example:

const name = null;

console.log(name ?? "Default Name"); // "Default Name"

const age = 0;

console.log(age ?? 18); // 0 (not null or undefined)

🔹 89. Optional chaining ?. (ES11 / 2020)

Safely accesses nested object properties without throwing an error if a property is null or

undefined.

Example:

const user = { profile: { name: "Sandeep" } };

console.log(user.profile?.name); // "Sandeep"

console.log(user.address?.city); // undefined (no error)

🔹 90. Promise.allSettled() (ES11 / 2020)

Waits for all promises to settle (fulfilled or rejected) and returns an array of their results.

Example:

const promises = [Promise.resolve(1), Promise.reject("Error")];

Promise.allSettled(promises).then(results => console.log(results));

// [

// { status: "fulfilled", value: 1 },

// { status: "rejected", reason: "Error" }

// ]

🔹 91. replaceAll() for strings (ES12 / 2021)

Replaces all occurrences of a substring in a string.

Example:

const text = "JavaScript is fun. JavaScript is powerful.";

console.log(text.replaceAll("JavaScript", "JS"));

// "JS is fun. JS is powerful."

Note: Unlike replace(), replaceAll() replaces every match, not just the first.

🔹 92. Promise.any() (ES12 / 2021)

Returns the first fulfilled promise. Rejects only if all promises are rejected.

Example:

const promises = [

Promise.reject("Error1"),

Promise.resolve(42),

Promise.resolve(100)

Promise.any(promises).then(result => console.log(result)); // 42

🔹 93. Logical assignment operators (ES12 / 2021)

Combine logical operations with assignment: &&=, ||=, ??=.

Examples:

let a = true;

let b = false;

// AND assignment

a &&= false;

console.log(a); // false

// OR assignment

b ||= true;

console.log(b); // true

// Nullish assignment

let c = null;

c ??= 10;

console.log(c); // 10

🔹 94. at() method for arrays and strings (ES13 / 2022)

Returns the element at a specific index, supporting negative indexing.

Example – Array:

const arr = [10, 20, 30, 40];

console.log(arr.at(1)); // 20

console.log(arr.at(-1)); // 40 (last element)

Example – String:

const str = "JavaScript";

console.log(str.at(0)); // "J"

console.log(str.at(-3)); // "i"

🔹 95. Top-level await (ES13 / 2022)

Allows using await outside async functions in modules.

Example:

// In a module (ESM)

const data = await fetch("

.then(res => res.json());

console.log(data);

Notes:

  • Works only in modules, not in regular scripts.
  • Makes asynchronous initialization easier.

🔹 96. Object.hasOwn() (ES13 / 2022)

Checks whether an object has a specific own property (safer than hasOwnProperty).

Example:

const obj = { name: "Sandeep" };

console.log(Object.hasOwn(obj, "name")); // true

console.log(Object.hasOwn(obj, "age")); // false

Advantage:

  • Works even if hasOwnProperty is overwritten.

🔹 97. Array.findLast() and Array.findLastIndex() (ES14+ /

2023+)

  • findLast() – Returns the last element in the array that satisfies the provided

testing function.

  • findLastIndex() – Returns the index of the last element that satisfies the test.

Example – findLast():

const arr = [1, 2, 3, 4, 5, 6];

const lastEven = arr.findLast(x => x % 2 === 0);

console.log(lastEven); // 6

Example – findLastIndex():

const arr = [1, 2, 3, 4, 5, 6];

const lastEvenIndex = arr.findLastIndex(x => x % 2 === 0);

console.log(lastEvenIndex); // 5

🔹 98. New built-in methods introduced recently (ES14+ / 2023+)

Some useful new methods in modern JavaScript:

  • Array.findLast() & Array.findLastIndex() – Already covered.

Array.toSorted() – Returns a sorted copy of the array without mutating the original.

const arr = [3, 1, 2];

const sortedArr = arr.toSorted();

console.log(sortedArr); // [1, 2, 3]

console.log(arr); // [3, 1, 2]

  • Array.toReversed() – Returns a reversed copy without mutating original.
  • Array.toSpliced() – Returns a copy of the array with spliced elements removed

or replaced.

  • Array.with() – Returns a new array with an element replaced at a given index.
  • String.toSorted(), String.toReversed() – Similar operations for strings.

Note: These methods preserve immutability, unlike their older counterparts like sort()

and reverse().

🔹 99. What is the DOM?

The Document Object Model (DOM) is a programmatic representation of a webpage,

allowing JavaScript to read, manipulate, and modify HTML and CSS.

Example:

console.log(document.body); // Accesses the <body> element

🔹 100. Difference between innerHTML, innerText, and textContent

  • innerHTML – Returns/sets HTML content, including tags.
  • innerText – Returns/sets rendered text, respects CSS styles.
  • textContent – Returns/sets all text, ignores CSS, faster than innerText.

Example:

const div = document.querySelector("#myDiv");

div.innerHTML = "<p>Hello</p>"; // Inserts <p>Hello</p>

div.innerText = "<p>Hello</p>"; // Displays "<p>Hello</p>"

div.textContent = "<p>Hello</p>"; // Displays "<p>Hello</p>"

🔹 101. How do you select DOM elements?

Use selectors like:

document.getElementById("id")

document.getElementsByClassName("className")

document.getElementsByTagName("tagName")

document.querySelector(".className")

document.querySelectorAll("div p")

🔹 102. Difference between getElementById and querySelector

  • getElementById – Selects an element by its ID, returns one element.
  • querySelector – Selects first matching element by CSS selector (ID, class, tag,

etc.).

Example:

const el1 = document.getElementById("myDiv");

const el2 = document.querySelector("#myDiv"); // Same result

🔹 103. How do you create and append DOM elements?

const div = document.createElement("div");

div.textContent = "Hello World";

document.body.appendChild(div); // Adds the div to body

🔹 104. How do you update styles using JavaScript?

const div = document.querySelector("#myDiv");

div.style.backgroundColor = "lightblue";

div.style.fontSize = "20px";

🔹 105. What is addEventListener?

Attaches event listeners to DOM elements without overwriting existing ones.

Example:

const button = document.querySelector("#myButton");

button.addEventListener("click", () => {

alert("Button clicked!");

});

🔹 106. What is localStorage?

localStorage allows you to store key-value pairs in the browser that persist even

after the browser is closed.

Example:

localStorage.setItem("username", "Sandeep");

console.log(localStorage.getItem("username")); // "Sandeep"

🔹 107. What is sessionStorage?

sessionStorage stores key-value pairs for the duration of a page session. Data is

cleared when the tab or browser is closed.

Example:

sessionStorage.setItem("token", "abc123");

console.log(sessionStorage.getItem("token")); // "abc123"

🔹 108. Difference between localStorage and sessionStorage

Feature localStorage sessionStorage

Lifetime Persist after browser closes Cleared on tab/browser close

Storage limit ~5-10 MB ~5 MB

Scope Shared across tabs of the same

origin

Only available in the current tab

🔹 109. How do cookies work in JavaScript?

Cookies are small pieces of data stored in the browser and sent to the server with each

request.

Example:

// Set a cookie

document.cookie = "username=Sandeep; expires=Fri, 31 Dec 2025

23:59:59 GMT; path=/";

// Read cookies

console.log(document.cookie);

🔹 110. Difference between cookies and localStorage

Feature Cookies localStorage

Sent to

server?

Yes, with every HTTP request No, only client-side

Storage size ~4 KB ~5-10 MB

Expiry Can have expiration date Persistent until explicitly removed

Accessibility Both client & server Client only

🔹 111. What is the BOM (Browser Object Model)?

The Browser Object Model represents the browser’s window and environment, allowing

JavaScript to interact with the browser itself (not the page content).

Example:

console.log(window.innerWidth); // Width of browser window

console.log(window.navigator.userAgent); // Browser info

🔹 112. Difference between window and document

  • window – Represents the browser window, contains the BOM, global functions,

timers, and document.

  • document – Represents the HTML page content, part of the DOM.

Example:

console.log(window.location.href); // Current URL

console.log(document.title); // Page title

🔹 113. How do you use navigator and location objects?

  • navigator – Provides browser information.

console.log(navigator.userAgent);

console.log(navigator.language);

  • location – Provides URL info and allows navigation.

console.log(location.href); // Full URL

location.href = "

// Redirects page

🔹 114. What is setTimeout() and setInterval()?

  • setTimeout() – Executes a function once after a delay.

setTimeout(() => console.log("Hello after 2s"), 2000);

  • setInterval() – Executes a function repeatedly at intervals.

setInterval(() => console.log("Repeating every 1s"), 1000);

🔹 115. How do you detect browser features?

Feature detection ensures code runs only if a feature is supported.

if ('geolocation' in navigator) {

console.log("Geolocation is supported!");

} else {

console.log("Geolocation not supported");

🔹 116. What is a JavaScript module?

A module is a file that encapsulates code (variables, functions, classes) and exports it so

it can be imported into other files, promoting modularity and reusability.

Example (module.js):

export const pi = 3.14;

export function area(radius) {

return pi * radius * radius;

Usage (main.js):

import { pi, area } from './module.js';

console.log(area(5)); // 78.5

🔹 117. What are named vs default exports?

  • Named exports – Export multiple things with their names; must import using {}.

export const x = 10;

export const y = 20;

// Import

import { x, y } from './module.js';

  • Default export – Only one export per module; can import with any name.

export default function greet() { console.log("Hello!"); }

// Import

import greetFunc from './module.js';

greetFunc(); // Hello!

🔹 118. How do ES6 modules differ from CommonJS?

Feature ES6 Modules CommonJS

Syntax import / export require / module.exports

Loading Static (compile-time) Dynamic (runtime)

Browser support Native in modern browsers Needs bundler (Webpack,

Node.js)

Tree shaking Supported Not supported

🔹 119. What is tree shaking?

Tree shaking is a technique to remove unused code from a module during bundling,

reducing file size.

Example:

// utils.js

export function usedFunc() { return 1; }

export function unusedFunc() { return 2; }

// Only import usedFunc

import { usedFunc } from './utils.js';

Bundler removes unusedFunc from the final bundle.

🔹 120. What is a memory leak in JavaScript?

A memory leak occurs when memory that is no longer needed is not released, leading

to increased memory usage and potential slowdowns.

Example:

let arr = [];

function addToArray() {

arr.push(new Array(1000000).fill('*')); // Keeps adding large

arrays

Memory keeps growing because references are not cleared.

🔹 121. How can you avoid memory leaks?

  • Remove event listeners when not needed.
  • Nullify references to large objects.
  • Avoid global variables.
  • Use WeakMap or WeakSet for temporary storage.
  • Properly manage closures.

🔹 122. What is debouncing and throttling?

  • Debouncing – Ensures a function runs only after a specified delay since the last

call. Useful for input events.

function debounce(func, delay) {

let timer;

return function(...args) {

clearTimeout(timer);

timer = setTimeout(() => func.apply(this, args), delay);

  • Throttling – Ensures a function runs at most once every specified interval, useful

for scroll or resize events.

function throttle(func, limit) {

let lastCall = 0;

return function(...args) {

const now = Date.now();

if (now - lastCall >= limit) {

lastCall = now;

func.apply(this, args);

🔹 123. What is garbage collection?

Garbage collection is the automatic process of freeing memory that is no longer

referenced, handled by the JavaScript engine (e.g., V8).

Example:

let obj = { name: "Sandeep" };

obj = null; // Previous object is now eligible for garbage

collection

🔹 124. What is event loop starvation?

Event loop starvation occurs when long-running synchronous code blocks the event

loop, preventing other tasks (like UI updates or async callbacks) from executing.

Example:

while(true) {} // Infinite loop blocks everything

🔹 125. What are best practices for writing efficient JavaScript?

  • Minimize DOM manipulations.
  • Use event delegation.
  • Avoid global variables.
  • Use debounce/throttle for frequent events.
  • Leverage ES6+ features for clean and performant code.
  • Use let/const instead of var.
  • Optimize loops and array methods.

🔹 126. What is functional programming?

Functional programming (FP) is a programming paradigm where functions are treated as

first-class citizens and focus on pure functions, immutability, and avoiding side effects.

Example:

const add = (a, b) => a + b; // Pure function

🔹 127. What is immutability?

Immutability means data cannot be changed after it is created. Instead, new objects or

arrays are returned when updates are needed.

Example:

const arr = [1, 2, 3];

const newArr = [...arr, 4]; // Original arr remains unchanged

🔹 128. What are map(), filter(), and reduce()?

  • map() – Creates a new array by transforming each element.

[1,2,3].map(x => x*2); // [2,4,6]

  • filter() – Creates a new array with elements that satisfy a condition.

[1,2,3].filter(x => x>1); // [2,3]

  • reduce() – Reduces array to a single value using a reducer function.

[1,2,3].reduce((sum, x) => sum+x, 0); // 6

🔹 129. What is function composition?

Function composition combines multiple functions into a single function, passing the

output of one as input to the next.

Example:

const double = x => x*2;

const increment = x => x+1;

const compose = (f, g) => x => f(g(x));

compose(double, increment)(3); // (3+1)*2 = 8

🔹 130. What is currying?

Currying transforms a function that takes multiple arguments into a sequence of functions

each taking a single argument.

Example:

const add = a => b => a + b;

add(2)(3); // 5

🔹 131. What is partial application?

Partial application pre-fills some arguments of a function to create a new function.

Example:

const multiply = (a, b) => a * b;

const double = multiply.bind(null, 2);

double(5); // 10

🔹 132. What is a pure function?

A pure function always returns the same output for the same input and has no side

effects.

Example:

const square = x => x*x; // Pure

🔹 133. What is referential transparency?

Referential transparency means an expression can be replaced by its value without

changing the program behavior.

Example:

const x = 10;

console.log(x + 5); // Can replace x with 10 directly

🔹 134. What is the difference between null and undefined?

  • null – Explicitly assigned to indicate no value.
  • undefined – Default value for uninitialized variables or missing properties.

let a; // undefined

let b = null; // explicitly no value

🔹 135. What is NaN?

NaN stands for Not-a-Number, representing an invalid numeric operation.

console.log("abc" * 2); // NaN

🔹 136. What is eval() and why is it dangerous?

eval() executes a string as JavaScript code. It is dangerous because it can execute

malicious code and cause security vulnerabilities.

eval("2 + 3"); // 5

🔹 137. What is strict mode ("use strict")?

Strict mode enables stricter parsing and error handling in JavaScript, preventing unsafe

actions like creating global variables accidentally.

"use strict";

x = 5; // Error: x is not defined

🔹 138. What is a Symbol?

Symbols are unique and immutable primitive values, often used as object property

keys.

const sym = Symbol('id');

const obj = { [sym]: 123 };

🔹 139. What is a generator function?

Generator functions use function* and can yield multiple values over time, allowing

lazy evaluation.

function* gen() {

yield 1;

yield 2;

const g = gen();

console.log(g.next().value); // 1

🔹 140. What is a WeakMap and WeakSet?

  • WeakMap – Object keys are weakly referenced, helps avoid memory leaks.
  • WeakSet – Set of objects with weak references.

let wm = new WeakMap();

wm.set({}, 'value'); // Key can be garbage collected

🔹 141. What is tail call optimization?

Tail call optimization allows recursive functions to reuse stack frames if the recursive

call is the last operation.

function factorial(n, acc = 1) {

if (n === 0) return acc;

return factorial(n - 1, n * acc); // Tail call

🔹 142. Difference between deep copy and shallow copy?

  • Shallow copy – Copies top-level properties only, nested objects remain

referenced.

  • Deep copy – Copies entire object structure, no references.

const obj = { a: 1, b: { c: 2 } };

const shallow = { ...obj };

const deep = JSON.parse(JSON.stringify(obj));

🔹 143. What is JSON and how do you parse/serialize it?

  • JSON – JavaScript Object Notation, a lightweight data interchange format.

const obj = { name: "John" };

const str = JSON.stringify(obj); // serialize

const parsed = JSON.parse(str); // parse

🔹 144. What are template literals?

Template literals allow embedded expressions using backticks `.

const name = "John";

console.log(`Hello ${name}`); // Hello John

🔹 145. Difference between synchronous and asynchronous code?

  • Synchronous – Executes line by line, blocking further execution.
  • Asynchronous – Executes non-blocking, allows other code to run while waiting.

🔹 146. What are modules and why are they useful?

Modules allow splitting code into reusable files and encapsulation, improving

maintainability.

// math.js

export const add = (a,b) => a+b;

// main.js

import { add } from './math.js';

🔹 147. What is transpilation (Babel, TypeScript)?

Transpilation converts modern JS/TypeScript code into older JavaScript compatible with

older browsers.

🔹 148. What is Type Coercion in JavaScript?

Type coercion is the automatic conversion between types.

console.log('5' - 2); // 3 (string -> number)

🔹 149. How do you detect if a variable is an array?

Array.isArray([1,2,3]); // true

🔹 150. What are polyfills?

Polyfills implement features in older browsers that don’t support them.

if (!Array.prototype.includes) {

Array.prototype.includes = function(el) {

return this.indexOf(el) !== -1;

🔹 151. How do you prevent global namespace pollution?

  • Use IIFE or modules.
  • Avoid global variables.

(function(){

const x = 10;

})();

🔹 152. What are IIFEs (Immediately Invoked Function Expressions)?

IIFE – A function that runs immediately after definition, often used for scoping.

(function() {

console.log("IIFE executed");

})();

More from JavaScript Tutorial

All questions for this course