| Feature name | Current browser | IE 7 | IE 8 | IE 9 | IE 10+ | FF 3 | FF 3.5, 3.6 | FF 4-20 | FF 21+ | SF 3.2 | SF 4 | SF 5 | SF 5.1.4 | SF 6+ | WebKit | CH 5 | CH 6 | CH 7-12 | CH 13-16 | CH 19-22 | CH 23+, OP 15+ |
Android 4.0 | Android 4.1 - 4.3 | Android 4.4+ | iOS7/8 | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| §Object/array literal extensions | 0/5 | 0/5 | 5/5 | 5/5 | 5/5 | 5/5 | 5/5 | 5/5 | 2/5 | 4/5 | 4/5 | 5/5 | 5/5 | 5/5 | 2/5 | 2/5 | 5/5 | 5/5 | 5/5 | 5/5 | 3/5 | 3/5 | 5/5 | 5/5 | ||||||||||||||
| §Getter accessors | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Setter accessors | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Trailing commas in object literals | No | No | Yes | Yes | Yes | Yes | Yes | Yes | ? | Yes | Yes | Yes | Yes | Yes | ? | ? | Yes | Yes | Yes | Yes | ? | ? | Yes | Yes | ||||||||||||||
| §Trailing commas in array literals | No | No | Yes | Yes | Yes | Yes | Yes | Yes | ? | Yes | Yes | Yes | Yes | Yes | ? | ? | Yes | Yes | Yes | Yes | ? | ? | Yes | Yes | ||||||||||||||
| §Reserved words as property names | No | No | Yes | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object static methods | 0/13 | 2/13 | 13/13 | 13/13 | 0/13 | 1/13 | 13/13 | 13/13 | 0/13 | 0/13 | 7/13 | 13/13 | 13/13 | 13/13 | 7/13 | 13/13 | 13/13 | 13/13 | 13/13 | 13/13 | 13/13 | 13/13 | 13/13 | 13/13 | ||||||||||||||
| §Object.create | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.defineProperty | No | Yes[1] | Yes | Yes | No | No | Yes | Yes | No | No | Yes[2] | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.defineProperties | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.getPrototypeOf | No | No | Yes | Yes | No | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.keys | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.seal | No | No | Yes | Yes | No | No | Yes | Yes | No | No | No | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.freeze | No | No | Yes | Yes | No | No | Yes | Yes | No | No | No | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.preventExtensions | No | No | Yes | Yes | No | No | Yes | Yes | No | No | No | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.isSealed | No | No | Yes | Yes | No | No | Yes | Yes | No | No | No | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.isFrozen | No | No | Yes | Yes | No | No | Yes | Yes | No | No | No | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.isExtensible | No | No | Yes | Yes | No | No | Yes | Yes | No | No | No | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.getOwnPropertyDescriptor | No | Yes[3] | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Object.getOwnPropertyNames | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array methods | 0/10 | 0/10 | 10/10 | 10/10 | 9/10 | 9/10 | 10/10 | 10/10 | 7/10 | 9/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | 10/10 | ||||||||||||||
| §Array.isArray | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.indexOf | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.lastIndexOf | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.every | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.some | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.forEach | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.map | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.filter | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.reduce | No | No | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Array.prototype.reduceRight | No | No | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §String properties and methods | 0/2 | 1/2 | 2/2 | 2/2 | 1/2 | 2/2 | 2/2 | 2/2 | 1/2 | 1/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | 2/2 | ||||||||||||||
| §Property access on strings | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §String.prototype.trim | No | No | Yes | Yes | No | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Date methods | 0/3 | 0/3 | 3/3 | 3/3 | 1/3 | 2/3 | 3/3 | 3/3 | 0/3 | 2/3 | 2/3 | 2/3 | 2/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | ||||||||||||||
| §Date.prototype.toISOString | No | No | Yes | Yes | No | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Date.now | No | No | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Date.prototype.toJSON | No | No | Yes | Yes | No | No | Yes | Yes | No | No | No | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | ||||||||||||||
| §Function.prototype.bind | No | No | Yes | Yes | No | No | Yes | Yes | No | No | No | Yes | Yes | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §JSON | No | Yes | Yes | Yes | No | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Immutable globals | 0/3 | 0/3 | 3/3 | 3/3 | 0/3 | 0/3 | 3/3 | 3/3 | 0/3 | 0/3 | 3/3 | 3/3 | 3/3 | 3/3 | 0/3 | 0/3 | 0/3 | 0/3 | 3/3 | 3/3 | 0/3 | 3/3 | 3/3 | 3/3 | ||||||||||||||
| §undefined | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No | No | Yes | Yes | No | Yes | Yes | Yes | ||||||||||||||
| §NaN | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No | No | Yes | Yes | No | Yes | Yes | Yes | ||||||||||||||
| §Infinity | No | No | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No | No | Yes | Yes | No | Yes | Yes | Yes | ||||||||||||||
| §Miscellaneous | 0/11 | 0/11 | 9/11 | 9/11 | 4/11 | 4/11 | 8/11 | 10/11 | 0/11 | 6/11 | 7/11 | 7/11 | 9/11 | 9/11 | 1/11 | 1/11 | 2/11 | 6/11 | 7/11 | 8/11 | 2/11 | 3/11 | 8/11 | 9/11 | ||||||||||||||
| §Array.prototype.sort: compareFn must be function or undefined | No | No | Yes | Yes | No | No | No | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No | ||||||||||||||
| §Array.prototype.sort: compareFn may be explicit undefined | No | No | Yes | Yes | No | No | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ||||||||||||||
| §Date.parse produces NaN for invalid dates | No | No | No | No | Yes | Yes | No | No | No | Yes | Yes | Yes | Yes | Yes | No | No | No | No | No | No | Yes | Yes | No | Yes | ||||||||||||||
| §Function.prototype.apply permits array-likes | ? | ? | Yes | Yes | No | No | Yes | Yes | No | No | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes | ? | ? | Yes | Yes | ||||||||||||||
| §parseInt ignores leading zeros | No | No | Yes | Yes | No | No | No | Yes | No | No | No | No | Yes | Yes | No | No | No | No | No | Yes | No | No | Yes | Yes | ||||||||||||||
| §Function "prototype" property is non-enumerable | ? | ? | Yes | Yes | No | No | Yes | Yes | ? | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes | ? | ? | Yes | Yes | ||||||||||||||
| §Arguments toStringTag is "Arguments" | ? | ? | Yes | Yes | No | No | Yes | Yes | ? | Yes | Yes | Yes | Yes | Yes | ? | ? | Yes | Yes | Yes | Yes | ? | ? | Yes | Yes | ||||||||||||||
| §Zero-width chars in identifiers | No | No | Yes | Yes | No | No | Yes[6] | Yes | No | No | No | No | Yes | Yes | No | No | No | No | Yes | Yes | No | Yes | Yes | Yes | ||||||||||||||
| §Unreserved words | ? | ? | Yes | Yes | Yes | Yes | Yes | Yes | ? | Yes | Yes | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes | ? | ? | Yes | Yes | ||||||||||||||
| §Enumerable properties can be shadowed by non-enumerables | ? | ? | No | No | Yes | Yes | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | ? | ? | No | No | ||||||||||||||
| §Thrown functions have proper "this" values | ? | ? | Yes | Yes | Yes | Yes | Yes | Yes | ? | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | ? | ? | Yes | Yes | ||||||||||||||
| §Strict mode | No | No | No | Yes[7] | No | No | Yes | Yes[8] | No | No | No | Yes | Yes | Yes | No | No | No | Yes | Yes | Yes | No | Yes | Yes | Yes | ||||||||||||||
[1] In Internet Explorer 8 Object.defineProperty only accepts DOM objects (MSDN reference).
[2] In some versions of Safari 5, Object.defineProperty does not work with DOM objects.
[3] In Internet Explorer 8 Object.getOwnPropertyDescriptor only accepts DOM objects (MSDN reference).
[4] Internet Explorer 6 - 8 do not differentiate between a dense array with undefined values, and a sparse array. Specifically, `0 in [,]` and `0 in [undefined]` both yield false - whereas in a compliant browser, the former would give `false`, the latter `true`. As such, ES5 array iteration methods can only be shimmed reliably when dealing with dense arrays.
[5] In Opera 11.60-11.64 Date.prototype.toJSON is undefined.
[6] Firefox 4 & 5 fail this test
[7] IE10 PP2 has a bug with strict mode which makes the following expression "fail", even though strict mode is more or less supported: (function(){ "use strict"; return !this })()
[8] In Firefox, strict getters on String, Boolean and Number prototypes receive wrapped this values (Bugzilla reference).