🔥 JavaScript Deep Dive: Understanding this, call(), apply(), and bind() One of the most important concepts in JavaScript is understanding how function context works. Many developers get confused with the behavior of the this keyword and how it changes depending on how a function is called. To control the value of this, JavaScript provides three powerful methods: call(), apply(), and bind(). Understanding these concepts is essential for writing clean, reusable, and predictable JavaScript code, especially when working with callbacks, event handlers, and modern frameworks. 📌 1️⃣ this Keyword In JavaScript, this refers to the object that is executing the current function. const user = { name: "Developer", greet() { console.log(`Hello ${this.name}`) } } user.greet() Output Hello Developer Here, this refers to the user object because the method is called using user.greet(). ⚡ 2️⃣ call() – Execute a function with a specific context The call() method invokes a function immediately and allows us to set the value of this. function greet(){ console.log(`Hello ${this.name}`) } const user = { name: "Developer" } greet.call(user) We can also pass arguments: function greet(city){ console.log(`${this.name} from ${city}`) } const user = { name: "Developer" } greet.call(user, "Meerut") ⚡ 3️⃣ apply() – Similar to call but arguments are passed as an array function greet(city, country){ console.log(`${this.name} from ${city}, ${country}`) } const user = { name: "Developer" } greet.apply(user, ["Meerut", "India"]) ⚡ 4️⃣ bind() – Creates a new function with a fixed this Unlike call() and apply(), the bind() method does not execute the function immediately. Instead, it returns a new function with the specified this value. function greet(){ console.log(`Hello ${this.name}`) } const user = { name: "Developer" } const greetUser = greet.bind(user) greetUser() 💡 Understanding the difference • call() executes the function immediately and arguments are passed normally (comma separated). • apply() also executes the function immediately, but arguments are passed as an array. • bind() does not execute the function immediately. Instead, it returns a new function with the this value permanently bound, which can be executed later. ⚡ Why this concept matters Understanding function context is crucial for: • Reusing functions across objects • Controlling behavior of callbacks • Writing modular and maintainable code • Working effectively with event handlers and asynchronous code Mastering these JavaScript fundamentals helps developers build more predictable and scalable applications. #JavaScript #WebDevelopment #Programming #FrontendDevelopment #Coding #SoftwareDevelopment #DeveloperJourney
Understanding JavaScript's this, call(), apply(), and bind()
More Relevant Posts
-
🚀 JavaScript Event Loop “JavaScript is single-threaded…” 🧵 👉 Then how does it handle timers, API calls, promises, and user interactions so smoothly? What is the Event Loop? 👉 The Event Loop is a mechanism that continuously checks the call stack and task queues, and executes code in the correct order without blocking the main thread. 👉 It ensures JavaScript remains non-blocking and efficient. To Understand Event Loop, You Need 5 Core Pieces: 1️⃣ Call Stack 📚 The Call Stack is a data structure that keeps track of function execution in JavaScript. It follows the Last In, First Out (LIFO) principle. ⚙️ How It Works: >> When a function is called → it is pushed onto the stack >> When the function completes → it is popped off the stack >> The stack always runs one function at a time Example: function greet() { console.log("Hello"); } greet(); 👉 Goes into stack → executes → removed 2️⃣ Web APIs 🌐 👉 Provided by the browser (not JavaScript itself) Handles async operations like: setTimeout, fetch, DOM events.... 3️⃣ Callback Queue (Macrotask Queue) 📥: The Callback Queue (also called Task Queue) is a place where callback functions wait after completing asynchronous operations, until the Call Stack is ready to execute them. ⚙️ How It Works: >> Async function (like setTimeout) runs in background >> After completion → its callback goes to Callback Queue Event Loop checks: > If Call Stack is empty → moves callback to stack > If not → waits 👉 Any callback from async operations like timers, events, or I/O goes into the Callback Queue (except Promises, which go to Microtask Queue). 4️⃣ Microtask Queue ⚡: The Microtask Queue is a special queue in JavaScript that stores high-priority callbacks, which are executed before the Callback Queue. ⚙️How It Works: Execute all synchronous code (Call Stack) Check Microtask Queue Execute ALL microtasks Then move to Callback Queue 5️⃣ Event Loop 🔁 👉 Keeps checking: 👉 “Is the call stack empty?” If YES: >> Execute all microtasks >> Then execute macrotasks Example: console.log("Start"); setTimeout(() => { console.log("Timeout"); }, 0); Promise.resolve().then(() => { console.log("Promise"); }); console.log("End"); Output: Start End Promise Timeout 🚀 Key Takeaways: >> JS executes synchronous code first >> Then Microtasks (Promises) completely >> Then Callback Queue (setTimeout, events) >> Event Loop keeps checking and moving tasks #JavaScript #EventLoop #AsyncJavaScript #WebDevelopment #Frontend #Coding #Developers #Programming #LearnJavaScript #100DaysOfCode
To view or add a comment, sign in
-
-
🚨 JavaScript Objects Confused Me… Until I Understood This One Thing When I started learning JavaScript, I thought objects were simple. Then I saw terms like object literals, constructor functions, "this", prototypes, "Object.create()"… And suddenly my brain went: "Wait… what is actually happening here?" 🤯 But once the puzzle clicked, everything started making sense. Here’s the simplest way I now understand JavaScript objects 👇 --- 🔹 1️⃣ Object Literals — The simplest way to create objects const user = { name: "Alex", age: 25 }; Clean. Simple. And used most of the time. --- 🔹 2️⃣ Constructor Functions — Blueprint for multiple objects function User(name, age) { this.name = name; this.age = age; } const u1 = new User("Alex", 25); Here, "this" refers to the new object being created. Think of it like a template for creating many similar objects 🧩 --- 🔹 3️⃣ Prototypes — JavaScript’s hidden superpower Instead of copying methods into every object, JavaScript shares them through prototypes. User.prototype.greet = function() { console.log("Hello!"); }; Now every "User" object can access "greet()" without duplicating memory 🚀 --- 🔹 4️⃣ Object.create() — Direct control over prototypes const person = { greet() { console.log("Hi!"); } }; const user = Object.create(person); This creates an object that inherits directly from another object. Simple concept. Very powerful in practice. --- 🔹 5️⃣ The "let" & "const" confusion with arrays and objects This confused me for a long time 👇 const arr = [1,2,3]; arr.push(4); // ✅ Works But this fails: const arr = [1,2,3]; arr = [4,5,6]; // ❌ Error Why? Because "const" protects the reference, not the content. Objects and arrays are reference types, so their internal values can change. But primitive values cannot: const a = 10; a = 20; // ❌ Error --- 🔥 Once you understand this: • Objects store references • Prototypes enable shared behavior • "this" depends on how a function is called JavaScript suddenly becomes much easier to reason about. And honestly… much more fun to work with. 🚀 --- 💬 If you're learning JavaScript: What concept confused you the most at first? Let’s help each other grow 👇 --- #javascript #webdevelopment #frontenddevelopment #softwaredevelopment #coding #programming #developer #100daysofcode #learnjavascript #codinglife #techlearning
To view or add a comment, sign in
-
🚀 JavaScript - Array.prototype & Prototype Chaining If you’ve ever used map(), filter(), or push()… Have you ever wondered where they actually come from? 🤔 You’re already using one of the most powerful concepts in JavaScript 👇 👉 Prototype-based inheritance ⚡ What is Array.prototype? Every array you create is not just a simple object… 👉 It is internally linked to a hidden object called "Array.prototype" This object contains all the built-in methods available to arrays. Example: const arr = [1, 2, 3]; arr.push(4); arr.map(x => x * 2); 👉 These methods are NOT inside your array directly 👉 They come from Array.prototype Behind the Scenes console.log(arr.__proto__ === Array.prototype); // true 👉 This means: >>arr is connected to Array.prototype >>That’s why it can access all its methods 👉 __proto__ is a hidden property that exists in every JavaScript object. 👉 It points to the object’s prototype. const arr = [1, 2, 3]; console.log(arr.__proto__); // Array.prototype ⚡ Types of Methods in Array.prototype 🔸 A. Transformation Methods: Used to create new arrays arr.map(), arr.filter(), arr.reduce() 👉 Do NOT modify original array 🔸 B. Iteration Methods: Used to check or loop arr.forEach(), arr.find(), arr.some(), arr.every() 🔸 C. Modification Methods: Change the original array arr.push(), arr.pop(), arr.shift(), arr.unshift(), arr.splice() 🔸 D. Utility Methods: Helpful operations arr.includes(), arr.indexOf(), arr.slice(), arr.concat() ⚡What is Prototype Chaining? 👉 When you access a method/property, JavaScript searches step by step: arr → Array.prototype → Object.prototype → null This process is called "Prototype chaining". Example const arr = [1, 2, 3]; arr.toString(); 👉 toString() is not in array methods list, So JS checks: arr → Array.prototype → Object.prototype → null 👉 Found in Object.prototype ⚡Prototype Chain Visualization [1,2,3] ↓ Array.prototype ↓ Object.prototype ↓ null 👉 This chain is called prototype chaining ⚡Adding Custom Methods (Powerful but Risky) You can extend arrays like this: Array.prototype.custom = function () { return "Custom method!"; }; const arr = [1, 2]; console.log(arr.custom()); 👉 Arrays don’t own methods 👉 They inherit them from Array.prototype 👉 JavaScript uses prototype chaining to find them #JavaScript #WebDevelopment #Frontend #Coding #Developers #Programming #LearnJavaScript #100DaysOfCode
To view or add a comment, sign in
-
🚀 JavaScript Event Loop in Action — Why setTimeout(0) Doesn't Run Immediately I recently experimented with a small JavaScript snippet to understand how blocking code interacts with timers and the event loop. Here is the code: console.log("Script start"); // Timer with 0ms setTimeout(() => { console.log("0ms timer executed"); }, 0); // Timer with 100ms setTimeout(() => { console.log("100ms timer executed"); }, 100); // Timer with 500ms setTimeout(() => { console.log("500ms timer executed"); }, 500); console.log("Starting heavy computation..."); // Blocking loop for (let i = 0; i < 100000000; i++) {} console.log("Heavy computation finished"); console.log("Script end"); 🔎 What we might expect Many developers assume that setTimeout(..., 0) will execute immediately. But that’s not how JavaScript works. ⚙️ Actual Execution Process 1️⃣ Script starts The synchronous code begins executing on the Call Stack. Script start 2️⃣ Timers are registered The setTimeout functions are handed over to the Web APIs environment. They start counting their timers in the background. 0ms timer 100ms timer 500ms timer But none of their callbacks execute yet. 3️⃣ Heavy synchronous computation starts The large for loop runs on the main thread and blocks it. Starting heavy computation... During this time: JavaScript cannot process any other tasks The call stack remains busy Even if timers expire, their callbacks must wait 4️⃣ Timers expire while the loop is running While the loop is still executing: 0ms timer expires 100ms timer expires Possibly even the 500ms timer But they cannot run yet because the call stack is still occupied. 5️⃣ Loop finishes Heavy computation finished Script end Now the Call Stack becomes empty. 6️⃣ Event Loop starts processing queued callbacks The Event Loop checks the Callback Queue and begins executing timers in order. 0ms timer executed 100ms timer executed 500ms timer executed 🧠 Key Takeaways ✔ JavaScript is single-threaded ✔ Long synchronous tasks block the event loop ✔ setTimeout(0) does not run immediately ✔ Timers only execute after the call stack is empty Understanding this behavior is essential for writing efficient asynchronous JavaScript and avoiding performance issues caused by blocking code. Next on my learning journey: exploring microtasks vs macrotasks and how Promises interact with the event loop. Sarthak Sharma Devendra Dhote #JavaScript #WebDevelopment #EventLoop #AsyncProgramming #FrontendDevelopment
To view or add a comment, sign in
-
🚀 Deep JavaScript Concepts Most Developers Don’t Know (But Should!) If you’re already comfortable with closures, promises, and async/await… here are some next-level JavaScript concepts that separate good devs from great ones 👇 🧠 1. Hidden Classes & Shapes (V8 Internals) JavaScript objects are dynamic, but engines like V8 JavaScript engine optimize them using hidden classes. 👉 Objects with the same structure share the same internal layout 👉 Changing structure later (adding/removing props) can deoptimize performance 🔄 2. Event Loop Internals (Microtask vs Macrotask) Not just “event loop” — the priority system matters: 👉 Microtasks (Promises, queueMicrotask) 👉 Macrotasks (setTimeout, setInterval) setTimeout(() => console.log("Macrotask"), 0); Promise.resolve().then(() => console.log("Microtask")); Output: Microtask Macrotask 👉 Microtasks always run before the next macrotask 🧩 3. Deoptimization (Deopt) — Silent Performance Killer Modern engines optimize your code using JIT, but certain patterns force them to fall back: ❌ Changing object shapes ❌ Using "delete" on objects ❌ Accessing out-of-bounds arrays ❌ Mixing types (number + string) 👉 This is called deoptimization, and it can silently slow your app 🧬 4. Garbage Collection (GC) Mechanics JavaScript uses automatic memory management, but not all objects are equal: 👉 Young Generation (fast cleanup) 👉 Old Generation (slower, long-lived objects) Engines like V8 JavaScript engine use Mark-and-Sweep + Generational GC 💡 Memory leaks still happen if references are retained! 🧮 5. Tagged Integers (SMI Optimization) Small integers are stored differently than large numbers: 👉 Fast path for small integers (SMIs) 👉 Large numbers → heap allocation This impacts performance in tight loops ⚡ 🔍 7. Prototype Chain Lookup Optimization Property access doesn’t just check the object: 👉 It walks the prototype chain 👉 Engines cache these lookups too const obj = {}; obj.toString(); // comes from prototype ⚙️ 8. JIT Compilation (Just-In-Time) JavaScript is not just interpreted anymore: 👉 Parsed → Compiled → Optimized at runtime 👉 Engines like Node.js use JIT for speed 💡 Hot code paths get highly optimized 🧨 9. Closures & Memory Retention Closures are powerful but can cause hidden memory issues: function outer() { let bigData = new Array(1000000); return function inner() { console.log("Using closure"); }; } 👉 "bigData" stays in memory because of closure reference! 🔐 10. Temporal Dead Zone (TDZ) "let" and "const" behave differently than "var": console.log(a); // ReferenceError let a = 10; 👉 Variables exist but are not accessible before initialization 🔥 Final Thought Most developers write JavaScript… Few understand how it actually runs under the hood. That difference? 👉 Performance 👉 Scalability 👉 Senior-level thinking #JavaScript #V8 #NodeJS #WebPerformance #SoftwareEngineering #TechDeepDive
To view or add a comment, sign in
-
🚀 Today we are going to analyse the JavaScript microtask queue, macrotask queue, and event loop. A junior developer once asked me during a code review: "Why does Node.js behave differently even when the code looks simple?" So I gave him a small JavaScript snippet and asked him to predict the output. console.log("Start"); setTimeout(() => { console.log("Timeout"); }, 0); Promise.resolve().then(() => { console.log("Promise"); }); console.log("End"); He answered confidently: Start Timeout Promise End But when we ran the code, the output was: Start End Promise Timeout He looked confused. That’s when we started analysing how JavaScript actually works internally. 🧠 Step 1: JavaScript is Single Threaded JavaScript runs on a single thread. It executes code line by line inside the call stack. So first it runs: console.log("Start") → Start console.log("End") → End Now the stack becomes empty. ⚙️ Step 2: Macrotask Queue setTimeout goes to the macrotask queue. Even though timeout is 0ms, it does not execute immediately. It waits in the macrotask queue. Examples of macrotasks: • setTimeout • setInterval • setImmediate • I/O operations • HTTP requests ⚡ Step 3: Microtask Queue Promise goes to the microtask queue. Examples of microtasks: • Promise.then() • Promise.catch() • Promise.finally() • process.nextTick (Node.js) • queueMicrotask() Microtasks always get higher priority. They execute before macrotasks. 🔁 Step 4: Event Loop Now the event loop starts working. The event loop checks: Is the call stack empty? Yes Check microtask queue Execute all microtasks Then execute macrotasks So execution becomes: Start End Promise Timeout Now everything makes sense. 🏗️ Real Production Example Imagine a Node.js API: app.get("/users", async (req, res) => { console.log("Request received"); setTimeout(() => console.log("Logging"), 0); await Promise.resolve(); console.log("Processing"); res.send("Done"); }); Execution order: Request received Processing Logging Why? Because Promise (microtask) runs before setTimeout (macrotask). This directly affects: • API response time • Logging • Background jobs • Queue processing • Performance optimization 🎯 Why Every Node.js / NestJS / Next.js Developer Should Know This Because internally: • Async/Await uses Promises • API calls use Event Loop • Background jobs use Macrotasks • Middleware uses Microtasks • Performance depends on queue execution Without understanding this, debugging production issues becomes very difficult. 💡 Final Thought JavaScript is not just a language. It is an event-driven execution engine. If you understand microtask queue, macrotask queue, and event loop, you don’t just write code — you understand how the runtime thinks. And once you understand the runtime, you start building faster and more scalable systems. #JavaScript #NodeJS #EventLoop #Microtasks #Macrotasks #NextJS #NestJS #SystemDesign #SoftwareEngineering
To view or add a comment, sign in
-
-
JavaScript Notes — Sync vs Async, Promises, Event Loop (Clear + Practical) Synchronous vs Asynchronous Synchronous (Sync) Code runs line by line, and each line waits for the previous one to finish. Asynchronous (Async) Code does not wait for long-running tasks. Execution moves forward, and the result is handled later. Why Async Matters? When working with APIs or third-party services, you don’t control response time. If you write everything synchronously → your app blocks and becomes slow If you don’t handle async properly → you’ll get undefined data or errors Async lets you: ->Continue execution ->Handle data when it arrives, not before JavaScript is Single-Threaded JavaScript can run only one task at a time. So how does async work? Call Stack → executes synchronous code Web APIs (Side Environment) → handle async tasks like timers, fetch Callback Queue → stores completed async tasks Event Loop → moves tasks to stack when it’s empty Important: The event loop keeps checking continuously, but it only pushes tasks when the stack is empty. Promises (Better than Callbacks) Promises make async code less messy and more predictable. A promise has 3 states: ->Pending → still in progress ->Fulfilled → resolved successfully ->Rejected → failed with error const promise = new Promise((resolve, reject) => { if (success) resolve(data); else reject(error); }); resolve() → goes to .then() reject() → goes to .catch() Async / Await Built on top of promises. Makes async code look synchronous Easier to read and debug async function getData() { try { const res = await fetch(url); const data = await res.json(); } catch (err) { console.log(err); } } Concurrency vs Parallelism Concurrency Handling multiple tasks without blocking, not truly at the same time. Parallelism Running tasks at the same time using multiple CPU cores JavaScript → Concurrency, not true parallelism (in main thread) Throttling vs Debouncing Throttling Limits how often a function runs → Example: API call every 2 seconds Debouncing Runs function only after user stops triggering it → Example: search input Final Takeaway JavaScript is single-threaded, but async makes it non-blocking Event loop is the key mechanism Promises and async/await are not optional — they’re required knowledge If you don’t understand this, you’ll struggle with APIs, performance, and debugging This is not advanced JavaScript. This is baseline knowledge every developer should have. #JavaScript #AsyncJavaScript #WebDevelopment #FrontendDevelopment #Programming #SoftwareDevelopment #EventLoop #Promises #AsyncAwait #JavaScriptFundamentals #Developers #CodingJourney #BuildInPublic #TechLearning
To view or add a comment, sign in
-
🚀 JavaScript Simplified Series — Day 23 A website without interaction is boring… 😴 No clicks No input No response Just static content ❌ 🤔 Real Question How does a website know… 👉 When you click a button? 👉 When you type in an input? 👉 When you scroll? This is where Events come in. 🔥 What is an Event? An event is something that happens in the browser 👉 Click 👉 Hover 👉 Key press 👉 Scroll JavaScript listens to these events and reacts. 🔹 Adding an Event Listener let button = document.querySelector("button") button.addEventListener("click", function() { console.log("Button Clicked") }) 👉 When user clicks → function runs 🔹 Common Events // Click button.addEventListener("click", fn) // Input input.addEventListener("input", fn) // Key press document.addEventListener("keydown", fn) 🔹 Real Example let btn = document.querySelector("button") let heading = document.querySelector("h1") btn.addEventListener("click", function() { heading.innerText = "You clicked the button!" }) 👉 Click → text change 😎 🔹 Event Object JavaScript automatically gives event details button.addEventListener("click", function(event) { console.log(event) }) 📌 You get info like: 👉 Mouse position 👉 Target element 👉 Key pressed 🔥 Real Life Example Think of a doorbell 🔔 You press → sound comes 👉 Action → Reaction Same in JS: User action → Event → Response 🔥 Simple Summary Event → user action addEventListener → listen to event function → response 💡 Programming Rule Websites react to users. Events make that possible. If you want to learn JavaScript in a simple and practical way, you can follow these YouTube channels: • Rohit Negi • Hitesh Choudhary (Chai aur Code) 📌 Series Progress Day 1 → What is JavaScript Day 2 → Variables & Data Types Day 3 → Type Conversion & Operators Day 4 → Truthy & Falsy + Comparison Operators Day 5 → If Else + Switch + Ternary Day 6 → Loops Day 7 → Break + Continue + Nested Loops Day 8 → Functions Basics Day 9 → Arrow + Default + Rest Parameters Day 10 → Callback & Higher Order Functions Day 11 → Arrays Basics Day 12 → Array Methods Day 13 → Array Iteration Day 14 → Advanced Array Methods Day 15 → Objects Basics Day 16 → Object Methods + this Day 17 → Object Destructuring Day 18 → Spread & Rest Day 19 → Advanced Objects Day 20 → DOM Introduction Day 21 → DOM Selectors Day 22 → DOM Manipulation Day 23 → Events Day 24 → Event Bubbling (Next Post) Follow for more 🚀 #JavaScriptSimplified #javascript #webdevelopment #coding #programming #learninpublic #100DaysOfCode #frontenddevelopment #devcommunity #codingjourney #softwaredeveloper #techcommunity #dailylearning #codeeveryday
To view or add a comment, sign in
-
🤔 Ever seen code like const { name: fullName } = user or const [first, ...rest] = arr and thought: “Okay... I kind of know what it does, but why is this so common?” That is destructuring and aliasing in JavaScript. 🧠 JavaScript interview question What is destructuring / aliasing in JavaScript, and how is it useful? ✅ Short answer Destructuring lets you extract values from arrays or objects into variables in a shorter, cleaner way. Aliasing means renaming a destructured property while extracting it. That helps you: write less repetitive code set default values pull only what you need avoid variable name conflicts make function parameters easier to read 🔍 Array destructuring With arrays, destructuring is based on position: const rgb = [255, 200, 100]; const [red, green, blue] = rgb; You can skip items or provide defaults: const coords = [10]; const [x = 0, y = 0, z = 0] = coords; // x = 10, y = 0, z = 0 And you can collect the rest: const numbers = [1, 2, 3, 4, 5]; const [first, ...rest] = numbers; // first = 1, rest = [2, 3, 4, 5] 📦 Object destructuring With objects, destructuring is based on property names, not position: const user = { id: 123, name: "Alice", age: 25 }; const { id, name } = user; You can also set fallback values: const { nickname = "Anon" } = user; 🏷️ What aliasing means Aliasing is just renaming during destructuring: const person = { firstName: "Bob", "last-name": "Smith" }; const { firstName: first, "last-name": last } = person; // first = "Bob", last = "Smith" This is useful when: you already have a variable with the same name the original property name is unclear the property name is not convenient to use directly 🧩 Destructuring in function parameters A very common real-world pattern: function printUser({ name: fullName, age }) { console.log(`${fullName} is ${age} years old.`); } Instead of writing user.name and user.age inside the function, you extract what you need immediately. That makes the function signature more self-explanatory. 🌳 Nested destructuring Destructuring can also go deeper into nested data: const data = { user: { id: 42, preferences: { theme: "dark", languages: ["en", "es", "fr"], }, }, }; const { user: { id: userId, preferences: { theme, languages: [primaryLang, ...otherLangs], }, }, } = data; ⚠️ Common thing people mix up Destructuring extracts values. It does not clone deeply. So if the extracted value is an object or array, you are still dealing with references. 💡 Why it is useful in real projects Cleaner code with less repetition Better defaults when data is missing Easier-to-read function parameters Safer naming with aliasing Very handy when working with API responses, props, and config objects That is why destructuring shows up everywhere in React, Node.js, and modern JavaScript codebases. #javascript #webdevelopment #frontend #reactjs #typescript
To view or add a comment, sign in
-
💡 JavaScript Tip: 3 Advanced NaN Tricks Most Developers Don’t Know NaN stands for "Not-a-Number". It represents the result of an invalid numeric operation in JavaScript. Even though its name suggests otherwise, JavaScript still treats NaN as a number type. Here are 3 advanced NaN behaviors that many developers don’t know: -------------------------------------------------- 1️⃣ Object.is() Can Correctly Compare NaN Normally, NaN is not equal to itself: NaN === NaN // false However, Object.is() can correctly compare it: Object.is(NaN, NaN) // true Example: console.log(Object.is(NaN, NaN)); // true This is useful when you need precise value comparisons. -------------------------------------------------- 2️⃣ NaN Propagates Through Calculations Once NaN appears in a calculation, it spreads through the entire result. Example: let value = NaN; console.log(value + 5); // NaN console.log(value * 10); // NaN console.log(Math.sqrt(value)); // NaN This means a single invalid number can break an entire calculation chain. Best practice: if (Number.isNaN(value)) { console.error("Invalid number detected"); } -------------------------------------------------- 3️⃣ NaN in Arrays: includes() vs indexOf() Arrays treat NaN differently depending on the method used. Example: const arr = [NaN, 1, 2]; console.log(arr.includes(NaN)); // true console.log(arr.indexOf(NaN)); // -1 Why? - indexOf() uses strict equality (===) - includes() uses SameValueZero comparison, which correctly handles NaN. -------------------------------------------------- ✅ Best Ways to Detect NaN Use these methods: Number.isNaN(value) Object.is(value, NaN) Avoid using isNaN() because it converts values to numbers first, which can cause confusing results. -------------------------------------------------- Small JavaScript details like this can help prevent hidden bugs in real-world applications. #JavaScript #WebDevelopment #Frontend #Programming #SoftwareEngineering #almaskhan #JavaScript #fblifestyle
To view or add a comment, sign in
-
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development