What Are Polyfills in JavaScript?

Modern JavaScript keeps improving every year.

But here’s the problem:

Not all browsers support new JavaScript features immediately.

So what happens if you use a modern feature like Array.prototype.includes() in an older browser that doesn’t support it?

💥 Your code breaks.

This is where Polyfills come in.


What Is a Polyfill?

A polyfill is a piece of JavaScript code that adds support for newer features in older browsers.

In simple terms:

A polyfill is a fallback implementation of a feature that doesn’t exist in a browser.

It “fills the gap” (poly + fill).


Why Do We Need Polyfills?

Different browsers support different JavaScript features.

Example:

  • Chrome supports modern features quickly
  • Internet Explorer (older versions) doesn’t
  • Some mobile browsers lag behind

If you build an app using modern features:

  • It may work in Chrome
  • It may fail in older browsers

Polyfills make your code work everywhere.


Real Example Without Polyfill

Consider this modern JavaScript method:

const numbers = [1, 2, 3, 4];
console.log(numbers.includes(3));

includes() checks if a value exists in an array.

Works in modern browsers ✅
Fails in older browsers ❌

Error:

TypeError: numbers.includes is not a function

Writing a Simple Polyfill

Let’s write a polyfill for Array.prototype.includes.

if (!Array.prototype.includes) {
Array.prototype.includes = function (value) {
for (let i = 0; i < this.length; i++) {
if (this[i] === value) {
return true;
}
}
return false;
};
}

What’s happening here?

  1. We check if includes exists.
  2. If not, we define it ourselves.
  3. Now older browsers can use includes().

That’s a polyfill 🎉


How Polyfill Works Internally

Imagine:

  • Browser doesn’t know includes
  • We manually add it to Array.prototype
  • Now browser behaves like it supports it

So instead of upgrading the browser,
we simulate the feature.


Another Example: Promise Polyfill Concept

Modern JavaScript has Promise.

Old browsers didn’t.

If you try this:

new Promise((resolve, reject) => {
resolve("Done");
});

Old browsers: ❌ Error

To fix this, developers used libraries that provided Promise polyfills.

Example library:

  • core-js
  • es6-promise

How Polyfills Are Used in Real Projects

In modern projects (React, Angular, Vue), we usually don’t write polyfills manually.

Instead, we use tools like:

  • Babel
  • core-js
  • polyfill.io

What Is core-js?

core-js is a popular polyfill library.

Install:

npm install core-js

Import:

import "core-js/stable";

It automatically adds missing features.


Babel and Polyfills

Babel converts modern JavaScript into older JavaScript.

But Babel alone doesn’t add missing features.

Example:

Babel converts:

const sum = (a, b) => a + b;

Into:

var sum = function(a, b) {
return a + b;
};

But if you use Promise, Babel won’t magically create it.

That’s where polyfills are needed.


Polyfill vs Transpiling (Very Important)

Many developers confuse these.

🔹 Transpiling

Converts new syntax to old syntax.

Example:
Arrow functions → normal functions

Tool: Babel


🔹 Polyfill

Adds missing built-in features.

Example:
Promise, includes, fetch

Tool: core-js


When Do You Need Polyfills?

You need them when:

  • Supporting older browsers
  • Supporting older mobile devices
  • Working with enterprise apps
  • Supporting Internet Explorer (legacy systems)

When You DON’T Need Polyfills

If:

  • Your app supports only modern browsers
  • You control the environment (internal app)
  • You are using Node.js latest version

You may not need them.


Final Summary

Polyfill:

  • Is fallback code for unsupported features
  • Makes modern JavaScript work in old browsers
  • Can be written manually or added via libraries
  • Is different from transpiling
  • Is crucial for cross-browser compatibility

Interview-Ready Explanation

If asked:

What is a polyfill?

You can say:

A polyfill is JavaScript code that implements a feature that a browser does not natively support, allowing modern features to work in older environments.

That’s a strong answer.