Power Your Software Testing with AI Agents and Cloud
The Native AI-Agentic Cloud Platform to Supercharge Quality Engineering. Test Intelligently and Ship Faster.
- TestMu AI (Formerly LambdaTest)
- /
- Learning Hub
- /
- ES6: Browser Support, Features, Known Issues
ES6: Browser Support, Features, Known Issues
ES6 works in Chrome 51+, Edge 15+, Firefox 54+, Safari 10+ on macOS and iOS, Opera 38+, and Samsung Internet 5+. Learn ES6 browser support, features, and known issues.
Published on:
ES6, or ECMAScript 2015, is the sixth edition of the ECMAScript standard from Ecma International's TC39 that added let, const, classes, arrow functions, promises, and modules to JavaScript. It works in Chrome 51+, Edge 15+, Firefox 54+, Safari 10+, Opera 38+, and Samsung Internet 5+, while Internet Explorer 11 supports only a small subset.
This guide covers what ES6 is, the browsers that support it, the key features, how to check support, the ES5 differences, and the known issues.
What is ES6?
ES6 is the sixth edition of the ECMAScript language specification, also known as ECMAScript 2015 or ES2015. Ecma International's TC39 committee publishes it as ECMA-262. It adds block-scoped variables, classes, arrow functions, template literals, destructuring, default parameters, promises, and native modules to JavaScript.
Which browsers does ES6 support?
ES6 works in every modern desktop and mobile browser, with Chrome, Firefox, Safari, Edge, Opera, and Samsung Internet all shipping the full specification by default. Internet Explorer 11 covers only a small slice, and IE 9 and 10 do not support ES6 at all.
ES6 compatibility in Chrome
Chrome supports the full ES6 specification from Chrome 51 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 21 to 50 had partial support, with arrow functions, classes, and let or const arriving in stages. Chrome 1 to 20 did not support any ES6 features. Chrome for Android follows the same version numbers as desktop Chrome.
ES6 compatibility in Edge
Microsoft Edge supports ES6 from Edge 15 on Windows 10, the first version to ship the full specification. Legacy EdgeHTML 12 to 14 had partial support, with most syntax features working but a few iterator and tail-call corners missing. Chromium-based Edge from Edge 79 inherits Chrome's full ES6 support on Windows, macOS, Linux, and Android.
ES6 compatibility in Firefox
Firefox supports the full ES6 specification from Firefox 54 on Windows, macOS, Linux, and Android. Firefox 6 to 53 had progressive partial support, with let and const landing in Firefox 44, classes in Firefox 45, and arrow functions in Firefox 22. Firefox 1 to 5 did not support ES6.
ES6 compatibility in Safari
Safari supports the full ES6 specification from Safari 10 on macOS Sierra and from Safari 10 on iOS 10. Safari 7.1 to 9.1 on macOS and Safari 7 to 9.3 on iOS shipped partial ES6 support, with classes, let, const, and template literals appearing across that range. Safari 6 and earlier do not support ES6.
ES6 compatibility in Opera
Opera supports the full ES6 specification from Opera 38, which tracks the same Chromium engine as Chrome 51. Opera 15 to 37 had partial support that mirrored Chromium's progress. Opera Mobile 38 and later support ES6 on Android. Opera 12 and earlier, on the Presto engine, do not support ES6.
ES6 compatibility in Samsung Internet
Samsung Internet supports the full ES6 specification from Samsung Internet 5 on Galaxy phones and tablets. Samsung Internet 4 had partial support that mirrored Chrome 44. The browser is built on Chromium, so it follows the same ES6 rollout as Chrome for Android.
ES6 compatibility in Android Browser
Chrome for Android supports the full ES6 specification from Chrome 51 on Android 4.1 and later. The legacy stock Android Browser shipped with Android 4.4 had partial ES6 support, mostly typed arrays and Map and Set. The pre-Chromium Android Browser on Android 4.3 and earlier does not support ES6. Modern Android phones use Chrome for Android, Samsung Internet, or Firefox for Android.
ES6 compatibility in Internet Explorer
Internet Explorer 11 supports a small subset of ES6, mostly typed arrays, Map, Set, WeakMap, and WeakSet. It does not support let, const, arrow functions, classes, modules, promises, template literals, destructuring, default parameters, or rest and spread. IE 9 and 10 do not support any ES6 features. Microsoft has retired Internet Explorer, so any new ES6 work targets Edge or another modern browser.
Note: ES6 syntax breaks across older Safari, IE 11, and legacy mobile WebView builds. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
What are the key features of ES6?
ES6 added the largest set of language features in any single ECMAScript edition. Most modern JavaScript code, including React, Vue, Angular, Node.js, and TypeScript output, depends on these features by default.
- let and const: Block-scoped variable declarations that replace the function-scoped var. const blocks reassignment, which makes intent obvious to the reader and stops a class of bugs.
- Arrow functions: Concise function syntax with a lexical this binding. Useful for callbacks, array methods like map and filter, and event handlers where you want to keep the outer this.
- Classes: A clean syntax for prototype-based inheritance with constructor, extends, super, and static. The runtime semantics still use prototypes underneath.
- Template literals: Backtick strings that support multi-line text and ${expression} interpolation without escape characters or string concatenation.
- Destructuring: Pulls values out of arrays or objects in one expression. Works in function parameters, return values, and import statements.
- Default, rest, and spread: Default parameter values, the rest parameter that gathers extra arguments into an array, and the spread operator that expands arrays or objects into elements.
- Promises: Built-in Promise object for chaining asynchronous work, the building block for fetch and async or await in later editions.
- Modules: Native import and export statements that replace CommonJS or AMD module systems. Browsers load them with type="module" on the script tag.
- Map, Set, WeakMap, WeakSet: Real hash-map and hash-set collection types with stable insertion order, replacing object-as-map workarounds.
- Symbols and iterators: A new primitive type plus the iterator and iterable protocols that power for...of loops and generator functions.
How do you check if a browser supports ES6?
You can confirm ES6 support inside any browser by trying to compile a small block of ES6 syntax with the Function constructor and checking that the global Symbol and Promise objects exist. The Function constructor throws a SyntaxError on engines that cannot parse ES6, which gives you a reliable yes or no answer.
Paste this snippet into the browser DevTools console to confirm ES6 support and the related ES6 module loader hook:
// Paste this into the browser DevTools console to test ES6 support.
function supportsES6() {
try {
// Each line uses an ES6-only construct: arrow function with default param,
// class syntax, template literal with const, and array destructuring with let.
new Function("(a = 1) => a")();
new Function("class T {}");
new Function("const x = `v${1}`");
new Function("let [a, b] = [1, 2]");
return typeof Symbol === "function" && typeof Promise === "function";
} catch (e) {
return false;
}
}
console.log("ES6 supported in this browser:", supportsES6());
console.log("Module script support:", "noModule" in document.createElement("script"));If supportsES6() returns true, the engine handles every common ES6 syntax feature. The noModule check tells you whether the same engine recognises the script type="module" attribute, which is the gate for native ES6 modules. For a finer-grained read, use compat-table.github.io/compat-table/es6/ in any browser.
What is the difference between ES5 and ES6?
ES5 is the JavaScript baseline that every browser, including IE 9, supports natively. ES6 is the 2015 rewrite that brings JavaScript closer to languages like Java, Python, and C# in syntax and ergonomics.
| Dimension | ES5 | ES6 |
|---|---|---|
| Standard edition | 5th edition of ECMA-262 | 6th edition of ECMA-262, also called ECMAScript 2015 |
| Variable declarations | var only, function-scoped | let and const for block scope, plus var |
| Functions | function expressions, dynamic this | Arrow functions with lexical this, default and rest parameters |
| Classes | Prototype chain with manual setup | class, extends, super, and static keywords |
| Strings | String concatenation with quotes and the plus operator | Backtick template literals with interpolation and multi-line |
| Async | Callback-based, manual error handling | Native Promise object with chaining and Promise.all |
| Modules | None native, CommonJS or AMD on the side | Native import and export with script type="module" |
| Browser reach | Every browser including IE 9 and IE 10 | Chrome 51+, Firefox 54+, Safari 10+, Edge 15+, Opera 38+, Samsung Internet 5+. IE 11 partial only. |
What are the known issues with ES6 in older browsers?
ES6 has near-universal modern support, but a few real failure modes still bite teams that target older Windows fleets, embedded WebViews, or international markets where legacy mobile browsers persist. The biggest hits are Internet Explorer, partial-support Safari builds, and silent module-loader breakage.
- Internet Explorer 11 ignores most ES6 syntax: Any inline arrow function, class, let, const, or template literal throws a SyntaxError on parse. The whole script fails to load, not just the offending statement, so the page silently breaks.
- Older Safari hangs on partial features: Safari 9 supports classes and let, but proper tail calls and full destructuring landed only in Safari 10. Code that destructures inside a default parameter throws on Safari 9 and earlier.
- ES6 modules need type="module": Browsers ignore import and export when the script tag lacks type="module". Forgetting that attribute is the most common reason a working module setup throws "unexpected token" in production.
- Tail call optimisation is not really shipped: The spec calls for proper tail calls, but only Safari and JavaScriptCore implement it. Code that relies on PTC for deep recursion overflows in Chrome, Firefox, and Edge.
- Symbol.toPrimitive is uneven on legacy mobile: Older Samsung Internet and Android Browser builds skip the Symbol.toPrimitive coercion path. Custom valueOf or Symbol.toPrimitive logic returns the default object string instead.
- const with destructuring tripped older WebViews: Mobile WebViews based on pre-Chromium engines parse "const { a } = obj" inconsistently. Test embedded WebViews on real Android devices before assuming ES6 parity with the system Chrome build.
- Polyfills do not cover syntax: Polyfill libraries like core-js add Map, Set, and Promise to old engines, but they cannot add new syntax. You still need Babel or TypeScript to compile let, const, classes, and arrow functions to ES5 for IE 11.
In my experience, the most surprising failure happens on corporate Windows fleets where IE 11 still loads in compatibility mode for one internal app. A single inline arrow function in a third-party widget script crashes the whole page with "Object doesn't support this property or method", and the error never surfaces in dev tools because IE silently skips the rest of the script. Always wrap third-party widgets in a feature detect or a Babel build before shipping to a Windows enterprise audience.
Citations
All ES6 version numbers and feature notes in this guide come from these primary sources:
- Ecma International - ECMA-262, ECMAScript 2015 Language Specification: 262.ecma-international.org/6.0
- TC39 - Current ECMAScript specification: tc39.es/ecma262
- MDN Web Docs - JavaScript language overview: developer.mozilla.org/en-US/docs/Web/JavaScript/Language_overview
- MDN Web Docs - JavaScript Classes reference: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
- MDN Web Docs - let statement: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
- MDN Web Docs - import statement: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
- Wikipedia - ECMAScript: en.wikipedia.org/wiki/ECMAScript
- Wikipedia - ECMAScript version history: en.wikipedia.org/wiki/ECMAScript_version_history
- WebKit - ES6, ES7, and beyond: webkit.org/blog/6756/es6-feature-complete
- Mozilla Hacks - ES6 In Depth introduction: hacks.mozilla.org/2015/04/es6-in-depth-an-introduction
- Chrome for Developers - V8 release notes archive: v8.dev/blog
- Microsoft Learn - Microsoft Edge JavaScript support: learn.microsoft.com/en-us/microsoft-edge/web-platform
- Apple Developer - Safari Release Notes: developer.apple.com/documentation/safari-release-notes
Author
Prince Dewani is a Community Contributor at TestMu AI specializing in AI agents, software testing, QA, and SEO. He is certified in Selenium, Cypress, Playwright, Appium, Automation Testing, and KaneAI, and presented academic research on AI agents at PBCON-01. At TestMu AI, he has also carried out extensive cross-browser research on the support of modern web technologies such as WebGPU, WebAssembly, WebXR, WebGL2 and other web technologies, validating their compatibility and feature parity across major browsers and rendering engines through rigorous hands-on testing. Prince has hands-on experience building AI agent workflows using Anthropic Claude, Google Antigravity, n8n, LangChain, and other agentic frameworks, and works regularly with MCP and A2A protocols. He shares his work with 5,500+ QA engineers, developers, DevOps experts, tech leaders, and AI agent practitioners on LinkedIn.
Frequently asked questions
Did you find this page helpful?
More Related Blogs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance
- Advanced access controls
- Advanced data retention rules
- Advanced Local Testing
- Premium Support options
- Early access to beta features
- Private Slack Channel
- Unlimited Manual Accessibility DevTools Tests





