Copyright © 2005–2010 Thomas Lahn <js@PointedEars.de> (contributors)
Last modified: 2010-06-17T10:50:45+00:00
Available online at http://PointedEars.de/scripts/test/es-matrix/
The following table lists all features of ECMAScript implementations that are not part of the first versions/editions of all of these languages, with the version/edition that introduced it; furthermore, information about features that have been deprecated is included. That means if a language feature is not listed here, you can consider it to be universally supported.
In addition, features have been highlighted with a greenish background color if this author considers them safe to use without prior feature test even when they do not appear to be formally specified or to be supported among all versions of all implementations considered here. This is based on the fact that all minimum versions of the implementations that a feature requires can be considered obsolete because the user agents known to implement them can be considered obsolete (see the respective version information for details). Note that this assessment is likely to be subject to change as more implementations are evaluated. If taken as a recommendation for design decisions, it should be taken as a light one.
The content of this table is based on what could be found in vendor's online documentations to date and on occasions where the respective features could be tested; it does not claim to be accurate or complete (please note how each feature is marked). Any correction/addition as to how things really are is welcome and will be credited where it is due.
If you are using Firefox 3.0.x and the scrollable table body flows out of the table, you are observing Bug 423823, fixed since Firefox 3.0.2. Since this was a regression, this author deems it necessary not to cover it with a workaround. The Firefox 3.0 branch has met its end-of-life on 2010-03-30 CE. If you are still using Firefox 3.0.x as your primary browser, you are strongly recommended to update Firefox. As an alternative, you can toggle table body scrollability.
| Feature ! A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
ECMAScript | This impl.[1] | JavaScript | JScript | V8 | JSC | Opera | KJS | |||
|---|---|---|---|---|---|---|---|---|---|---|---|
|
|||||||||||
| * discrepancy between the vendor's documentation and the real implementation | |||||||||||
| ? unconfirmed contribution by other people | |||||||||||
|
When a feature has been marked as tested, the following user agents have been used for the tests:
|
|||||||||||
!== |
3 [11.9.5] | 1.3 | 5.1.5010 | 1.3 | 412.6.2 | 5.02 | 3.5.9 | ||||
"\uhhhh" : string |
1 [7.7.4/7.8.4] | 1.3 | 5.1.5010 | 1.3 | 525.13 | 6.06 | 4.3.4 | ||||
"foo\ |
5 [7.8.4] | N/A | 1.8.1 | 5.1.5010 | 1.3 | 525.13 | −[2] | 4.3.2 | |||
+expression : number |
1 | 1.3 | 3.1.3510 | 1.3 | 525.13 | 5.02 | 3.5.9 | ||||
/[^]/ : RegExp |
3 | N/A | 1.5 | − | 2.1 | 530.17 | 5.02 | 4.4.3 | |||
/…/[g][i]
: RegExp |
− | 1.2 | 3.1.3510 | 1.3 | 525.13 | 5.02 | 3.5.9 | ||||
/…/[g][i][m]: RegExp |
3 | 1.5 | 5.5.6330 | 1.3 | 525.13 | 5.02 | 3.5.9 | ||||
/…/[g][i][m][y]
: RegExp |
− | N/A | 1.8.1 | − | − | 531.9 | − | − | |||
/(?!…)/ : RegExp |
3 | 1.5 | 5.5.6330 | 1.3 | 525.13 | 7.02 | 3.5.9 | ||||
/(?:…)/ : RegExp |
3 | 1.5 | 5.5.6330 | 1.3 | 525.13 | 7.02 | 3.5.9 | ||||
/(?=…)/ : RegExp |
3 | 1.5 | 5.5.6330 | 1.3 | 525.13 | 7.02 | 3.5.9 | ||||
/(…+?|…*?)/
: RegExp |
3 | 1.5 | 5.5.6330 | 1.3 | 525.13 | 7.02 | 3.5.9 | ||||
/\uhhhh/ : RegExp |
3 | 1.3 | 5.1.5010 | 1.3 | 525.13 | 6.06 | 4.3.4 | ||||
label: |
3 | 1.5 | 3.1.3510 | 1.3 | 525.13 | 5.02 | 3.5.9 | ||||
identifier : type |
4 | N/A | 2.0 | 7.0 | − | − | − | − | |||
== |
1 | 1.0[3] | 5.1.5010 | 1.3 | 525.13 | 5.02 | 3.5.9 | ||||
=== |
3 | 1.3 | 5.1.5010 | 1.3 | 525.13 | 5.02 | 4.3.2 | ||||
[value, …] : Array |
3 | 1.3 | 5.1.5010 | 1.3 | 525.13 | 5.02 | 4.3.4 | ||||
[value, ] : Array |
3 | 1.3 | 5.1.5010 | 1.3 | 525.13 | 7.02[4] | 4.3.4 | ||||
[expression for (propertyName
in Object)
[if (condition)]] : Array[expression for each (propertyValue
in Object)
[if (condition)]]
: Array[V] |
− | N/A | 1.7 | − | − | − | − | ||||
[var] [var1,
[var2],
var3, …] = Array |
− | N/A | 1.7 | − | − | − | − | ||||
var \uhhhh |
3 | 1.5 | 5.5.6330 | 2.0 | 525.13 | 6.06 | 4.3.4 | ||||
{propertyName:
propertyValue, …} : Object |
3 | 1.3 | 5.1.5010 | 1.3 | 525.13 | 5.02 | 3.5.9 | ||||
{propertyName: propertyValue, } : Object |
5 | N/A | 1.3 | − | 1.3 | 525.13 | − | 4.3.4 | |||
abstract |
4 | N/A | 2.0 | 7.0 | |||||||
new ActiveXObject("serverName.typeName"[,
location : String]) |
− | − | 3.0 | − | |||||||
arguments |
1 | 1.1 | 5.1.5010 | 1.3 | 525.13 | 5.02 | 4.3.4 | ||||
arguments.callee : Function |
1 | 1.2 | 5.1.5010 | 1.3 | 525.13 | 5.02 | 4.3.4 | ||||
arguments.caller
: Function|null |
− | 1.1[5] | −[6] | − | − | − | − | ||||
arguments.length : number|int |
1 | 1.1 | 5.1.5010 | 1.3 | 525.13 | 5.02 | 4.3.4 | ||||
Array(…) |
1 | 1.1 | 2.0 | 5.02 | |||||||
Array.every(iterable,
callback : Function) : boolean |
− | 1.6 | − | − | |||||||
Array.isArray(arg) : boolean |
5 [15.4.3.2] | ||||||||||
array.length : number|int |
1 | N/A | 1.1 | ||||||||
Array.some(iterable,
callback : Function) : boolean |
− | 1.6 | − | − | |||||||
Array.prototype : Array |
1 | 5.1.5010 | 5.02 | ||||||||
Array.prototype.concat([item1[,
item2[, …]]])
: Array |
3 | 1.2 | 3.0 | 5.02 | |||||||
Array.prototype.constructor : Array |
1 | 1.1 | |||||||||
Array.prototype.every(callback
: Function[, thisValue])
: boolean |
5 [15.4.4.16] | 1.6 | − | − | |||||||
Array.prototype.filter(callback
: Function[, thisArg
: Object]) : number|int |
5 [15.4.4.20] | 1.6 | |||||||||
Array.prototype.forEach(callback
: Function[, thisArg
: Object]) : number|int |
5 [15.4.4.18] | 1.6 | |||||||||
Array.prototype.indexOf(searchElement[,
fromIndex : Number|int]) : number|int |
5 [15.4.4.14] | 1.6 | − | − | |||||||
Array.prototype.join(separator : String)
: string |
1 | 1.1 | 2.0 | 5.02 | |||||||
Array.prototype.lastIndexOf(searchElement[,
fromIndex : Number|int]) : number|int |
5 [15.4.4.15] | 1.6 | |||||||||
Array.prototype.length : number|int |
1 | 1.1 | 2.0 | 5.02 | |||||||
Array.prototype.map(callback
: Function[, thisArg
: Object]) : number|int |
5 [15.4.4.19] | 1.6 | |||||||||
Array.prototype.pop() |
3 | 1.2 | 5.5 | 5.02 | |||||||
Array.prototype.push([item1[,
item2[,
…]]]) : number|int |
3 | N/A | 1.2 | 5.5 | 5.02 | ||||||
Array.prototype.reduce(callback
: Function[, initialValue]) : any |
5 [15.4.4.21] | N/A | 1.8 | ||||||||
Array.prototype.reduceRight(callback
: Function[, initialValue]) : any |
5 [15.4.4.22] | N/A | 1.8 | ||||||||
Array.prototype.reverse() : Array |
1 | N/A | 1.1 | 2.0 | 5.02 | ||||||
Array.prototype.shift() |
3 | N/A | 1.2 | 5.5 | 5.02 | ||||||
Array.prototype.slice(start
: Number|int[,
end : Number|int]) : Array |
3 | N/A | 1.2 | 3.0 | 5.02[7] | ||||||
Array.prototype.some(callback
: Function[,
thisValue]) : boolean |
5 [15.4.4.17] | N/A | 1.6 | − | − | ||||||
Array.prototype.sort([comparator
: Function]) : Array |
1 | N/A | 1.1[8][9][10] | 2.0 | |||||||
Array.prototype.splice(start : Number|int,
deleteCount : Number|int[,
item1[, item2[,
…]]]) : Array |
3 | N/A | 1.2[11] | 5.5.6330 | |||||||
Array.prototype.toSource() : string |
− | N/A | 1.3 | ||||||||
Array.prototype.toString() : string |
1 | N/A | 1.1 | ||||||||
Array.prototype.unshift() : number|int |
3 | N/A | 1.2? | 5.5 | |||||||
boolean |
4 | N/A | 2.0 | 7.0 | |||||||
Boolean(…) |
1 | N/A | 1.1 | 2.0 | |||||||
Boolean.prototype : Boolean |
1 | 5.1.5010 | 5.02 | ||||||||
Boolean.prototype.toSource() : string |
− | N/A | 1.3 | ||||||||
Boolean.prototype.toString() : string |
1 | N/A | 1.1 | ||||||||
Boolean.prototype.valueOf() : boolean |
1 | N/A | 1.1 | ||||||||
byte |
4 | N/A | 2.0 | 7.0 | |||||||
@cc_on |
− | N/A | − | 3.0 | |||||||
char |
4 | N/A | 2.0 | 7.0 | |||||||
class |
4 | N/A | 2.0 | 7.0 | |||||||
const |
4 | N/A | 1.5 | 7.0 | |||||||
Date.prototype : Date |
1 | 5.1.5010 | 5.02 | ||||||||
Date.prototype.getFullYear() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getMilliseconds() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getUTCDate() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getUTCDay() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getUTCFullYear() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getUTCHours() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getUTCMilliseconds() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getUTCMinutes() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getUTCMonth() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getUTCSeconds() : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.getVarDate() |
− | N/A | − | 3.0 | |||||||
Date.prototype.setFullYear(year : Number|int[,
month : Number|int[,
date : Number|int]]) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setMilliseconds(Number|int) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setUTCDate(Number|int) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setUTCDay(Number|int) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setUTCFullYear(year : Number|int[,
month : Number|int[,
date : Number|int]]) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setUTCHours(hours : Number|int[,
minutes : Number|int[,
seconds : Number|int]]) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setUTCMilliseconds(Number|int) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setUTCMinutes(minutes : Number|int[,
seconds : Number|int[,
ms : Number|int]]) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setUTCMonth(month : Number|int[,
date : Number|int]) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.setUTCSeconds(seconds : Number|int[,
ms : Number|int]) : number|int |
1 | N/A | 1.3 | 3.0 | |||||||
Date.prototype.toDateString() : string |
3 | 1.5 | 5.5.6330 | 525.13 | 5.02 | 3.5.9 | |||||
Date.prototype.toGMTString() : string |
1 | 1.3 | 5.1.5010 | 525.13 | 5.02 | 3.5.9 | |||||
Date.prototype.toISOString() : string |
5 | 1.8.1 | − | ||||||||
Date.prototype.toJSON([key]) : string |
5 | 1.8.1 | − | ||||||||
Date.prototype.toLocaleDateString() : string |
3 | 1.5 | 5.5.6330 | 525.13 | 5.02 | 3.5.9 | |||||
Date.prototype.toLocaleFormat(format : String) : string |
− | 1.6 | − | − | − | − | |||||
Date.prototype.toLocaleString() : string |
1 | 1.3 | 5.1.5010 | 525.13 | 5.02 | 3.5.9 | |||||
Date.prototype.toLocaleTimeString() : string |
3 | 1.5 | 5.5.6330 | 525.13 | 5.02 | 3.5.9 | |||||
Date.prototype.toSource() : string |
− | 1.3 | − | − | − | − | |||||
Date.prototype.toString() : string |
1 | 1.3 | 5.1.5010 | 525.13 | 5.02 | 3.5.9 | |||||
Date.prototype.toTimeString() : string |
3 | 1.5 | 5.5.6330 | 525.13 | 5.02 | 3.5.9 | |||||
Date.prototype.toUTCString() : string |
1 | 1.3 | 5.1.5010 | 525.13 | 5.02 | 3.5.9 | |||||
@debug |
− | N/A | − | 7.0 | |||||||
debugger |
5 [12.15] | N/A | − | 3.0 | |||||||
decimal |
− | N/A | − | 7.0 | |||||||
decodeURI(String) : string |
3 | N/A | 1.5 | 5.5 | |||||||
decodeURIComponent(String) : string |
N/A | 1.5 | 5.5 | ||||||||
delete |
N/A | 3.0 | |||||||||
do…while |
N/A | 3.0 | |||||||||
double |
4 | N/A | 2.0 | 7.0 | |||||||
encodeURI(String) |
N/A | 1.5 | 5.5 | ||||||||
encodeURIComponent(String) : string |
N/A | 1.5 | 5.5 | ||||||||
enum |
N/A | 2.0 | 7.0 | ||||||||
Enumerator(…) |
− | N/A | − | 3.0 | |||||||
Error([message : String]) |
N/A | 5.0 | |||||||||
Error.prototype.description : string |
N/A | 5.0 | |||||||||
Error.prototype.message : string |
N/A | 5.5 | |||||||||
Error.prototype.name : string |
N/A | 5.5 | |||||||||
Error.prototype.number : number|int |
N/A | 5.0 | |||||||||
Error.prototype.stack : string |
− | N/A | 1.5 | − | − | ||||||
expando |
N/A | 7.0 | |||||||||
final |
N/A | 7.0 | |||||||||
float |
4 | N/A | 2.0 | 7.0 | |||||||
for each ([var] identifier in Object) |
E4X | N/A | 1.6 | − | |||||||
Function([p1 : String[,
p2 : String[, …],
pn : String],]
body : String) : Function |
1 | N/A | 1.1 | 2.0 | |||||||
function get identifier(…) : Function |
N/A | 7.0 | |||||||||
function set identifier(…) : Function |
N/A | 7.0 | |||||||||
= function
identifier(…) {…} : Function |
1 | 1.3 | 5.1.5010 | 525.13 | 5.02 | 3.5.9 | |||||
= function(…) {…} : Function |
3 | 1.3 | 3.1.3510 | 525.13 | 5.02 | 3.5.9 | |||||
= function(…) expression : Function |
− | N/A | 1.8 | − | |||||||
if (…) { function f() { … }; } |
− | 1.3 | 3.1.3510 | 525.13 | 5.02 | 3.5.9 | |||||
Function.prototype : Function |
1 | 5.1.5010 | 5.02 | ||||||||
Function.prototype.arity : number|int |
N/A | 1.2[12] | |||||||||
Function.prototype.apply([thisArg : Object|undefined[, argArray : Array|arguments]]) |
3 | N/A | 1.3 | 5.5.6330 | |||||||
Function.prototype.arguments : arguments |
− | N/A | 1.0[13] | 2.0 | |||||||
Function.prototype.arguments.callee : Function |
− | N/A | 1.2[14] | 5.6 | |||||||
Function.prototype.arguments.length : number|int |
− | N/A | 1.0[15] | ||||||||
Function.prototype.call([thisArg
: Object|undefined[,
arg1[, arg2,
…]]) |
3 | N/A | 1.3 | 5.5.6330 | |||||||
Function.prototype.caller : Function|null |
− | 1.0 | 2.0 | ||||||||
Function.prototype.length : number|int |
N/A | 2.0 | |||||||||
Function.prototype.prototype : Object |
1.8.2[16] | −[17] | −[18] | −[19] | −[20] | ||||||
Function.prototype.toSource() : string |
N/A | 1.3 | |||||||||
Generator.close()[V] |
− | N/A | 1.7 | − | |||||||
Generator.next()[V] |
− | N/A | 1.7 | − | |||||||
Generator.send(expression)[V] |
− | N/A | 1.7 | − | |||||||
Generator.throw(expression)[V] |
− | N/A | 1.7 | − | |||||||
GetObject(…) |
− | N/A | − | 3.0 | |||||||
| Global object | 1 | N/A | 1.0 | 3.0 | |||||||
hide |
N/A | 7.0 | |||||||||
@if |
− | N/A | − | 3.0 | |||||||
import |
N/A | 7.0 | |||||||||
(String in Object) : boolean |
3 | N/A | 1.4 | 5.0 | |||||||
Infinity : number |
1 | 1.3 | 5.1.5010 | 525.13 | 5.02 | ||||||
instanceof |
3 | N/A | 1.4 | 5.0 | |||||||
int |
4 | N/A | 2.0 | 7.0 | |||||||
interface |
4 | N/A | 2.0 | 7.0 | |||||||
internal |
4 | N/A | 2.0 | 7.0 | |||||||
isFinite(…) : boolean |
N/A | 3.0 | |||||||||
Iterator(Object) : Iterator |
− | N/A | 1.7 | − | |||||||
JSON.parse(text : String[,reviver : Function]) : Object |
5 | 1.8.1 | − | − | − | − | |||||
JSON.stringify(value[, replacer[, space]]) : string |
5 | 1.8.1 | − | − | − | − | |||||
let (assignment[, …])
{ [statements] }[V] |
− | N/A | 1.7 | − | |||||||
let (assignment[,
…]) expression[V] |
− | N/A | 1.7 | − | |||||||
let assignment[,
…][V] |
− | N/A | − | ||||||||
long |
4 | N/A | 2.0 | 7.0 | |||||||
Math.max(a : Number,
b : Number) : number |
1 | 1.3 | 3.1.3510 | 525.13 | 5.02 | 3.5.9 | |||||
Math.max(a : Number,
b : Number, …) : number |
3 | 1.5 | 5.5.6330 | 525.13 | 5.02 | 3.5.9 | |||||
Math.min(a : Number,
b : Number) : number |
1 | N/A | 1.3 | 3.1.3510 | |||||||
Math.min(a : Number,
b : Number, …) : number |
3 | N/A | 1.5 | 5.5.6330 | |||||||
NaN : number |
1 | 1.3 | 5.1.5010 | 525.13 | 5.02 | ||||||
Number([expression])
: number |
N/A | 1.0 | |||||||||
Number.MAX_VALUE : number |
N/A | 2.0 | |||||||||
Number.MIN_VALUE : number |
N/A | 2.0 | |||||||||
Number.NaN : number |
5.1.5010 | 5.02 | |||||||||
Number.NEGATIVE_INFINITY : number |
N/A | 2.0 | |||||||||
Number.POSITIVE_INFINITY : number |
N/A | 2.0 | |||||||||
Number.prototype : Number |
1 | 1.1 | 5.1.5010 | 2.0 | 5.02 | ||||||
Number.prototype.toString() : string |
1 | 1.2 | 5.1.5010 | 525.13 | 5.02 | ||||||
Object([expression]) : Object |
N/A | 3.0 | |||||||||
Object.getOwnPropertyNames(o : Object) : Array |
5 [15.2.3.4] | 2.1 | − | ||||||||
Object.getPrototypeOf(o : Object) : Object |
5 [15.2.3.2] | 1.8.1 | − | 2.0.6 | − | ||||||
Object.prototype : Object |
1 | 5.1.5010 | 5.02 | ||||||||
Object.prototype.__defineGetter__(propertyName: string,
getter: Function) |
− | N/A | 1.5 | − | |||||||
Object.prototype.__defineSetter__(propertyName: string,
setter: Function) |
− | N/A | 1.5 | − | |||||||
Object.prototype.__iterator__ |
− | N/A | 1.7 | − | |||||||
Object.prototype.__proto__ |
− | 1.3 | − | 2.0 | − | ||||||
Object.prototype.constructor : Function |
1 | N/A | 1.1 | 2.0 | |||||||
Object.prototype.hasOwnProperty(propertyName : String)
: boolean |
3 | N/A | 1.5 | 5.5.6330 | 525.13 | 3.5.9 | |||||
Object.prototype.isPrototypeOf(Object)
: boolean |
3 [15.2.4.6] | 1.5 | 5.5 | 525.13 | 5.02 | 4.3.4 | |||||
Object.prototype.propertyIsEnumerable(propertyName
: String) : boolean |
N/A | 5.5 | |||||||||
Object.prototype.toSource() : string |
− | N/A | 1.0 | − | |||||||
override |
N/A | 7.0 | |||||||||
package |
N/A | 7.0 | |||||||||
@position |
− | N/A | − | 7.0 | |||||||
print(string) |
− | N/A | − | 7.0 | |||||||
private |
N/A | 7.0 | |||||||||
protected |
N/A | 7.0 | |||||||||
public |
N/A | 7.0 | |||||||||
RegExp(…[,
"[g][i]"]) : RegExp |
− | N/A | 1.2 | − | |||||||
RegExp(…[, "[g][i][m]"]) : RegExp |
3 | N/A | 1.5 | 3.0 | |||||||
RegExp.$integer |
N/A | 3.0 | |||||||||
RegExp.{$& | lastMatch} |
N/A | 1.2 | 5.5 | ||||||||
RegExp.{$' | rightContext} |
N/A | 5.5 | |||||||||
RegExp.{$+ | lastParen} |
N/A | 5.5 | |||||||||
{RegExp | reArray}.{$_
| input} |
N/A | 1.2 | 3.0 | ||||||||
RegExp.{$` | leftContext} |
N/A | 5.5 | |||||||||
{RegExp | reArray}.index |
N/A | 3.0 | |||||||||
RegExp.prototype.compile(…) |
N/A | 3.0 | |||||||||
RegExp.prototype.exec(…) |
N/A | 3.0 | |||||||||
RegExp.prototype.global |
3 | N/A | 1.2 | 5.5 | |||||||
RegExp.prototype.ignoreCase |
3 | N/A | 1.2 | 5.5 | |||||||
RegExp.prototype.multiline |
3 | N/A | 1.2 | 5.5 | |||||||
RegExp.prototype.source |
N/A | 3.0 | |||||||||
sbyte |
N/A | 7.0 | |||||||||
ScriptEngine() |
− | N/A | − | 2.0 | |||||||
ScriptEngineBuildVersion() |
− | N/A | − | 2.0 | |||||||
ScriptEngineMajorVersion() |
− | N/A | − | 2.0 | |||||||
ScriptEngineMinorVersion() |
− | N/A | − | 2.0 | |||||||
@set |
− | N/A | − | 3.0 | |||||||
short |
N/A | 7.0 | |||||||||
| Strict Not Equal/Nonidentity operator | − | N/A | − | − | − | ||||||
String.prototype |
1 | 5.1.5010 | 5.02 | ||||||||
String.fromCharCode(Number|uint) |
1 | 1.3 | 5.1.5010 | 525.13 | 6.06 | 4.3.2 | |||||
String.prototype.charCodeAt(Number|uint) |
1[G] | 1.3 | 5.1.5010 | 525.13 | 5.02 | 4.3.2 | |||||
String.prototype.concat(…) |
N/A | 3.0 | |||||||||
String.prototype.localeCompare(string) |
3[G] | 1.8.1 | 5.5.6330 | 525.13 | 7.02 | 4.3.2 | |||||
String.prototype.match(RegExp) |
3 | N/A | 1.3 | 3.0 | |||||||
String.prototype.replace(string|RegExp, string) |
3 | N/A | 1.2 | 1.0 | |||||||
String.prototype.replace(string|RegExp, Function) |
3 | N/A | 1.3 | 5.5.6330 | |||||||
String.prototype.search(RegExp) |
N/A | 3.0 | |||||||||
String.prototype.slice(…) |
N/A | 1.0 | 3.0 | ||||||||
String.prototype.split(…) |
1 | N/A | 1.1 | 3.0 | |||||||
String.prototype.substr(start[,
length]) |
3 [B.2.3] | 1.2 | −[21] | 2.1 | 530.17 | 5.02 | 4.3.4 | ||||
String.prototype.trim() |
5 | 1.8.1 | − | − | − | − | |||||
string[Number|uint] |
− | 1.3 | − | 525.13 | − | 4.3.2 | |||||
switch (expression) {
case value: statements; [break;]
…
default: statements; [break;] } |
3 | N/A | 1.2 | 3.0 | |||||||
throw expression |
3 | N/A | 1.4 | 5.1.5010 | |||||||
try { [statements] }[statements] } |
3 | N/A | 1.4 | 5.1.5010 | |||||||
try { [statements] }[statements] } |
3 | N/A | 1.4 | − | |||||||
try { [statements] }[statements] }[statements] } |
3 | N/A | 1.4 | 5.0 | |||||||
try { [statements] }[statements] }[ catch (identifier) { [statements] }][ finally { [statements] }] |
− | N/A | 1.5 | − | |||||||
typeof expression |
1 | N/A | 1.1 | 1.0 | |||||||
undefined |
1 | N/A | 1.3 | 5.5 | |||||||
VBArray.prototype.dimensions() |
− | N/A | − | 3.0 | |||||||
VBArray.prototype.getItem(…) |
− | N/A | − | 3.0 | |||||||
VBArray.prototype.lbound(…) |
− | N/A | − | 3.0 | |||||||
window |
− | N/A | 1.0[22] | − | |||||||
window.setInterval(string,
msec) |
− | N/A | 1.2[23] | − | |||||||
window.setInterval(functionReference,
msec[, arg1[,
…, argN]]) |
− | N/A | 1.2[23] | − | |||||||
window.setTimeout(string,
msec) |
− | N/A | 1.0[24] | − | |||||||
window.setTimeout(functionReference,
msec[, arg1[,
…, argN]]) |
− | N/A | 1.2 | − | |||||||
yield expression[V] |
− | N/A | 1.7 | − | |||||||
| G↑ | This method is intentionally specified or implemented as generic;
it does not require that its this
value be an object of the same type. Therefore, it can be
transferred to other kinds of objects for use as a method. |
|---|---|
| V↑ | Version needs to be declared in order to use this feature |
| 1↑ |
|
| 2↑ | Opera 5.02 to 7.02 read escaped newline |
| 3↑ | deprecated since 1.4 for comparison of two
JSObject objects; use the
JSObject.equals
method instead |
| 4↑ | 5.02 and 6.06 show length 2, should be 1 |
| 5↑ | deprecated since 1.3 |
| 6↑ | see Function.prototype.caller |
| 7↑ | Opera 6.06 does not support negative values for start |
| 8↑ | 1.1: Does not work on some platforms; converts undefined elements to null |
| 9↑ | 1.2: Sorts undefined elements to the end of the array |
| 10↑ | 1.8: Stable sort |
| 11↑ | since 1.3: returns an array containing the removed elements |
| 12↑ | deprecated since 1.4 |
| 13↑ | deprecated since 1.4; use
arguments instead |
| 14↑ | deprecated since 1.4; use
arguments.callee
instead |
| 15↑ | deprecated since 1.4; use
arguments.length
instead |
| 16↑ | tested in 1.8.2 only |
| 17↑ | tested in 5.0 and 6.0 only, 8.x and 9.x Preview contributed by LRN |
| 18↑ | Chrome dev contributed by LRN |
| 19↑ | Safari 4.0.5 contributed by LRN |
| 20↑ | 9.52 contributed by LRN |
| 21↑ | Does not support negative values |
| 22↑ | removed in 1.4; Gecko DOM feature since 1.5 |
| 23↑ | removed in 1.4; Gecko DOM feature since 1.5 |
| 24↑ | removed in 1.4; Gecko DOM feature since 1.5 |
| JavaScript | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 | 1.8.1 | 1.8.2 | 2.0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1)↑ Version information from the JavaScript Guides and References; release dates from about: documents, mozilla.org and Wikipedia. | ||||||||||||
| Implementations | ||||||||||||
| Netscape/Mozilla.org SpiderMonkey | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 | 1.8.1 | 1.8.2 | - |
| Mozilla.org Epimetheus | + | |||||||||||
| Netscape/Mozilla.org Rhino | 1.4R3 (1999-05) | 1.5R1–1.5R5 (2000–2004) | 1.6R1–1.6R7 (2004–2007) | 1.7R1–1.7R2— (2008-03 – 2009-03—) | ||||||||
| Layout Engines | ||||||||||||
| Netscape/Mozilla.org NGLayout/Gecko | 0.6–1.8a6 | 1.8b1–1.8 | 1.8.1 | 1.9 | 1.9.1 | 1.9.2 | ||||||
| Web Browsers | ||||||||||||
| Netscape Navigator/Browser † | Navigator 2.0 † (1996-03) | 3.0 † (1996-08) | 4.0–4.05 † (1997-06) | 4.06–4.8 † (1998–2002) | - | Navigator 6.x – Browser 8.1.3 † (2000–2007) | - | Navigator 9.0b1 – 9.0.0.6 † (2007–2008) |
||||
| Mozilla Phoenix/Firebird/Firefox | Phoenix 0.1 – Firefox 1.0.8 † (2002–2006) |
Firefox 1.5a1–1.5.0.12 † (2005–2007) |
2.0b1–2.0.0.18 † (2006–2008) |
3.0a2–3.0.19 † (2007-02-07 – 2010-03-30) |
3.1a1–3.5.9— (2008-07-28 — 2010-03-30) |
3.6a1—3.6.3— (2010-01-21 – 2010-04-01—) |
||||||
| Other Clients | ||||||||||||
| Mozilla Application Suite † | 0.6–1.8a6 † (2000–2005) | 1.8b1–1.7.13 † (2005–2006) |
||||||||||
| Mozilla SeaMonkey | 1.0–1.0.9 † (2005–2007) | 1.1a–1.1.19 † (2006-08-30 – 2010-03-10) |
2.0a1 (2008-10-05) |
2.0a2–2.0.4— (2008-12-10 – 2010-03-30—) |
||||||||
| Mozilla Thunderbird | 2.0a1–2.0.0.24— (2006-07-28 – 2010-03-15—) | 3.0a1–3.0.4— (2008-03-13 – 2010-03-30—) | ||||||||||
| Web Servers | ||||||||||||
| Netscape
Enterprise Server/ iPlanet Web Server/ Sun ONE Web Server/ Sun Java System Web Server |
2.0 | 3.0 | 4.0/4.1 (1999) | 6.0 | ? | ? | ? | ? | ? | ? | ||
| JScript | 1.0 | 2.0 | 3.0 | 3.1.3510 | 4.0 | 5.0 | 5.1.5010 | 5.5.6330 | 5.6.6626 – 5.6.8819 | 5.7.5730 | 5.7.17184 | 5.8.18241 | 7.0 (.NET) | 7.1 (.NET) | 8.0 | 10.0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2)↑
Version information from MSDN Library;
release dates from MSDN Library, blooberry.com and Wikipedia,
end-of-life (†) dates from support.microsoft.com. Note that the language version supported by an environment may be greater than specified here due to security updates. When in doubt, use the script engine test above to determine the true version. |
||||||||||||||||
| Implementations | ||||||||||||||||
| Microsoft .NET Framework | 1.0 (2002-01) | 1.1 (2003) | 2.0–3.5 SP1 (2005–2008) | 4.0— (2010-04-12—) | ||||||||||||
| Web Browsers | ||||||||||||||||
| Microsoft Internet Explorer | 3.0 † (1996-08 CE) |
4.0 † (1997-09) |
4.01 † | 5.0 † (1999-03 – 2005-06) |
5.01 † | 5.5 † (2000-07 – 2005-12) |
6.0 for Win9x/NT/XP (2001-10) |
7.0 for WinXP+ (2006-10) |
8.0 beta 1 for WinXP SP2+ (2008-03) |
8.0 beta 2 for WinXP SP2+ (2008-08) |
||||||
| Web Servers | ||||||||||||||||
| Microsoft Internet Information Server/Services | 4.0 † (1998–2002) |
5.1–6.0 † (2000–2005) |
||||||||||||||
| Operating Systems | ||||||||||||||||
| Microsoft Windows | NT 4.0 † (1996) |
2000 † (2000-02 – 2005-06) |
Me † (2000-09 – 2005-12) |
XP (2001-10) |
Vista (2008-03) |
7 (2009-10) |
||||||||||
| Microsoft Windows Server | 2003 (2003-04) |
|||||||||||||||
| IDEs | ||||||||||||||||
| Microsoft Visual Studio | 6.0 † (1998–2005) |
.NET 7.0 (2002) |
.NET 7.1 (2003) |
8.0–9.0 (2005–2008) |
10.0— (2010-04-12—) |
|||||||||||
| V8 0.3 | 0.4 | 1.2 | 1.3 | 2.0 | 2.1 | |
|---|---|---|---|---|---|---|
| Google Chrome | 0.2–1.0 (2008-09 CE—2008-12) |
2.0 (2009-05) |
3.0 (2009-10) |
4.0.249 (2010-01-25) |
5.0.307 (2010-01-30) |
5.0.342 |
| JavaScriptCore 48–312.6 | 412–419.13 | 522.11–523.10 | 525.13 | 525.19 | 525.27.1 | 530.17 | 531.9 | 531.21.8 | |
|---|---|---|---|---|---|---|---|---|---|
| Apple Safari | 0.8–1.3.2 † (2003–2006 CE) |
2.0–2.0.4 (2005-04 – 2006-01) |
3.0–3.0.4 (2007-06 – 2007-10) |
3.1 (2008-03) |
3.1.2 (2008-06) |
3.2.1 (2008-11) |
4.0 (2009-06) |
4.0.3 (2009-08) |
4.0.4 (2009-11) |
| Opera ECMAScript 3.60 | 5.02 | 6.06 | 7.02 | 8.0 | 9.27 | 9.52 | 9.62 | 9.64 | 10.10 | 10.51 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Opera Browser | 3.60 † (1995?) |
5.02 † | 6.06 | 7.02 (2003–2005) |
8.0 (2005–2008) |
9.27 (2008) |
9.52 (2008) |
9.62 (2008–2009) |
9.64 (2009) |
10.10 (2009–2010) |
10.51 (2010) |
| ActionScript 1.0 | 2.0 | |||||||
|---|---|---|---|---|---|---|---|---|
| 3)↑ Version information from Macromedia | ||||||||
| Macromedia Flash | 5.0–MX (2000–2003) | 7.1.1 (MX 2004)— (2004—) | ||||||
The following table provides a rough overview of ECMAScript Editions and relations between them and versions of their implementations. Note that conforming implementations are allowed to extend ECMAScript, so these are by no means 1:n relations; instead, this is the result of a comparison of most common language features.
See Language Features above for details.
| ECMAScript Edition 1 | 2 | 3 | 4 (Working Draft; abandoned) |
5 | 6 ("Harmony", Working Draft) |
|
|---|---|---|---|---|---|---|
| June 1997 | August 1998 | December 1999 – March 2000 | August 2000 – June 2003 – 2008 | April 2009 – December 2009 | April 2009— | |
| ActionScript | 2.0 (2004) | 3.0 (2008—) | ||||
| JavaScript | 1.1, 1.3, 1.4 | 1.5–1.8.1.x | 2.0 | 1.8.1— (2008-05—) | ||
| JavaScriptCore | ||||||
| JScript | 1.0 (1996) | 5.5— (2000—) | 7.0— (2000—) | |||
| KJS | 1.0 | - | ||||
| Opera | 6.0 (2001-12) | |||||
| V8 | 0.3 |
| ECMAScript for XML (E4X) | |
|---|---|
| June 2004 | |
| ActionScript | 2.0 |
| JavaScript | 1.6+ |
| JavaScriptCore | - |
| JScript | - |
| KJS | - |
| Opera | - |
| V8 | - |
Thanks to: