There is no javascript.
Version 2
Copyright © 2005/2024 Thomas Lahn
<js@PointedEars.de>
(contributors)
Available online at http://PointedEars.de/es-matrix
“ECMAScript is a standard for object-oriented programming languages. Superficially, its implementations, like JavaScript and JScript, are very similar. They are therefore often discussed in a simplified way. But does this approach hold water against methodical testing?
In this work, features of ECMAScript and its common implementations are compared with regard to their standards compliance and compatibility. A web application is created for the registration of features and associated test cases. Using this application, the test cases are run in web browsers and the test results are stored in a database. The results are correlated with the market share of the used web browsers and their degree of vendor support. Thus, features can be defined as safe for use in web browsers, which makes efficiency-reducing compatibility measures unnecessary.”[1]
“Learn reason above all. Learn clear thought: learn to know what is from what seems to be, and what you wish to be.
This is the key to everything: the truth of reality, the reality of truth. What is will set you free.”—Surak
In a discussion, especially a technical one, it is very important that all participants know what is being talked about, so that misunderstandings can be avoided. Clear language is required. It can be achieved only by using terms that are well-defined; they should be unambiguous and one should be able to look them up in official reference material.
Some people talk about a programming language they call “javascript”. This is supposed to be one fully specified and universally implemented programming language that provides, in dialects to a varying degree, the capabilities to manipulate runtime environments such as web browsers.
In fact, there is no “javascript”; there is JavaScript. This is not just a matter of letter case: Originally, “JavaScript” was only the name of one implementation of ECMAScript.
“A scripting language is a programming language that is used to manipulate, customise, and automate the facilities of an existing system.”[2] The ECMAScript Language Specification is a standard for extensible scripting languages. It is published in Editions. Several current versions of scripting languages are implementations of an Edition of ECMAScript.[3][4][5][6][7][8][9] But its first Edition was based itself on two scripting languages that were already implemented for use in web browsers: Netscape JavaScript 1.1 and Microsoft JScript 1.0.[10]
There are no dialects of “javascript”; there are several implementations of ECMAScript that are widely distributed, primarily through web browsers. The features that allow one to manipulate web browsers are not part of any such programming language; they are environment-dependent implementations of language-independent APIs for which language bindings are specified[11] so that they can be used with programming languages.[12]
Superficially, ECMAScript implementations are very similar. Several of them even bear or are advertized using the “JavaScript” name now. It is therefore tempting to discuss them in a simplified way using an umbrella term such as “javascript”.[13] But this approach is not without problems. ECMAScript gives its conforming implementations a wide latitude. The Editions of ECMAScript and their implementations have been developed in parallel, and are partially informing each other. Also, some implementations are not conforming in some features. As a result, ECMAScript implementations are in fact very different from one another.
It does matter which implementation is being discussed. Using ambiguous umbrella terms, without providing a clear definition for them, cannot be considered appropriate style in a technical discussion.
Hence, for lack of a better alternative, the precise and equally concise term ECMAScript implementation(s) should be used when talking about features that several implementations (ought to) have in common (per the ECMAScript Language Specification). And whenever it was talked about one particular implementation, its full name should be used, like Mozilla JavaScript. In all other instances, the term “JavaScript” (in any letter case) should not be used.
This overview – the ECMAScript Support Matrix – began as a comparison of different “JavaScript” features and, as time passed and understanding grew, evolved into a comparison between the major ECMAScript implementations, detailing the differences, the quirks and the bugs. It has been serving its author (and its dedicated readers) for years in writing client-side scripts that work cross-browser, and has been helping to see the distinction between core language features, and APIs with language binding, like the DOM. (The features of the latter API will be compared in another Matrix.)
Whenever you read from this author that key line from arguably the most groundbreaking hacker movie ―“The Matrix has you!”― a suggestion is being considered as a contribution to this work. See below.
Despite several valuable contributions, the previous version of this work has primarily suffered from the fact that most language features could only be tested, and test results documented, as far as the resources of its author permitted. Furthermore, it was not possible without considerable effort to detail the differences between versions of the same implementation. Test cases were incomplete and sketchy at best.
This version is based on a novel, scientific approach[1], with which features can be tested by anyone in the runtime environments available to them, and those test results can be fed back to the overview immediately, detailing automatically the differences between the implementations and the versions of the same implementation.
As a result, the general recommendation as to whether a feature can be considered safe (see below) can be updated immediately and semi-automatically as well. This is assumed to further improve the overall quality of design decisions with regard to language features (although the caveat as to that must stay in place).
The following table lists features of ECMAScript and its implementations, with the Edition or version that introduced it; furthermore, information about features that have been deprecated is included.
Features are highlighted with a greenish background color if they can be considered 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 investigated. If taken as a recommendation for design decisions, it should be taken as a light one.
The contents of this table are based on what could be found in the Editions of ECMAScript and in vendor's online documentation to date. They are completed with results from test cases that have been run in a careful selection of host environments, and do not claim to be accurate or complete. Any correction/addition as to how things really are is welcome and will be credited where it is due.
Since both of these were regressions, this author deems it necessary not to cover any of them with a workaround.
1↑ | Lahn, Thomas (2012-03-12). Features von ECMAScript-basierten Programmiersprachen – Eine vergleichende Analyse (“Features of ECMAScript-based programming languages – A comparative analysis”) (revised). BSc SUPSI in Computer Science. Fernfachhochschule Schweiz (Swiss Distance University of Applied Sciences). |
---|---|
2↑ | Ecma International (2011‐06). Standard ECMA‒262. ECMAScript Language Specification. 5.1 Edition. (retrieved 2011‐08‐27) |
3↑ | Mozilla Developer Network and individual contributors (2014-10-18). A re-introduction to JavaScript (JS tutorial). (retrieved 2014‐10‐18) |
4↑ | Microsoft Corporation (2014). MSDN Library: JScript (ECMAScript3). (retrieved 2014‐10‐18) |
5↑ | Microsoft Corporation (2014). MSDN Library: JavaScript Language Reference. (retrieved 2014‐10‐18) |
6↑ | Opera Software ASA (2013). Opera browser: ECMAScript support in Opera Presto 2.12. (retrieved 2014‐10‐18) |
7↑ | The KDE developers (2013). KDE API Reference: KDE JavaScript/EcmaScript Engine. (retrieved 2014‐10‐18) |
8↑ | Apple Inc. (2014). The WebKit Open Source Project: JavaScriptCore. (retrieved 2014‐10‐18) |
9↑ | Google Inc. (2014). Google Developers: Chrome V8. (retrieved 2014‐10‐18) |
10↑ | Ecma International (1997‐06). ECMAScript Language Specification (1st edition) (retrieved 2012‐12‐10) |
11↑ | See W3C DOM Level 2 HTML for an example of language binding. |
12↑ | The distinction between core language and browser API was not made in Netscape JavaScript before version 1.4. JavaScript was designed to be the programming language for scripts in Netscape Navigator, therefore the Netscape API was part of JavaScript. This changed when JavaScript needed to work server-side in Netscape Enterprise Server as well. |
13↑ | Smith, Garrett and individual contributors (2010-10-08). comp.lang.javascript FAQ. Version 32.2. (updated by: Lahn, Thomas and individual contributors. FAQ for comp.lang.javascript) |
14↑ |
|
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.[2] |
V↑ | At least the version of the implementation that introduced the feature needs to be declared in order to use this feature (without syntax error). |
JavaScript | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 2.0 (historic) | 1.5 | 1.6 | 1.7 | 1.8 | 1.8.1 | 1.8.2 | 1.8.5 | 5 | 6 | 7 | 8 | 10 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1)↑ Version information from the JavaScript Guides and References; release dates from about: documents, mozilla.org and Wikipedia. | ||||||||||||||||||||||||||||||||||
Implementations | ||||||||||||||||||||||||||||||||||
Netscape Mocha | 1.0 | 1.1 | ||||||||||||||||||||||||||||||||
Netscape/Mozilla SpiderMonkey (in C) | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 1.8 | 1.8.1 (TraceMonkey) | 1.8.2 | 1.8.5 (JägerMonkey) | 5 | 6 | 7 | 8 | 10 | 12 | 13 | 15 | 16 | 17 | 18 (IonMonkey) | 19 | 20 (Baseline) | 21 | 22 (OdinMonkey) | 23 | 24 | 25 | 26 | 27 | 28 | |||
Mozilla Epimetheus (in C++) | + (2002) | |||||||||||||||||||||||||||||||||
Netscape/Mozilla Rhino (in Java) | 1.4R3 (1999) | 1.5R1–1.5R5 (2000/2004) | 1.6R1–1.6R7 (2004/2007) | 1.7R1–1.7R2 (2008/2009) | 1.7R3–1.7R4 (2011‐06‐03/ 2012‐06‐18) | |||||||||||||||||||||||||||||
Layout Engines | ||||||||||||||||||||||||||||||||||
Netscape/Mozilla NGLayout/Gecko | 0.6–1.8a6 | 1.8b1–1.8 | 1.8.1 | 1.9 | 1.9.1 | 1.9.2 | 1.9.3, 2.0 | 5.0 | 6.0 | 7.0 | 8.0–9.0 | 10.0–11.0 | 12.0 | 13.0–14.0 | 15.0 | 16.0 | 17.0 | 18.0 | 19.0 | 20.0 | 21.0 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | ||||||
Web Browsers | ||||||||||||||||||||||||||||||||||
Netscape Navigator/Browser † | Navigator 2.0 † (1996) | 3.0 † (1996) | 4.0–4.05 † (1997) | 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/2010) |
3.1a1–3.5.19 † (2008/2011) |
3.6a1–3.6.19 † (2010/2011) |
3.7a1–4.0.1 † (2010/2011) |
5.0–5.0.1 † (2011) |
6 † (2011) |
7 † (2011) |
8–9 † (2011/2012) |
10–11 † (2012) |
12 † (2012) |
13–14 † (2012) |
15 † (2012) |
16 † (2012) |
17 (2012) |
18 † (2013) |
19 † (2013) |
20.0–20.0.1 † (2013) | 21 † (2013) | 22 † (2013) | 23.0–23.0.1 † (2013‐08‐16) | 24.0–24.4.0esr (2013‐09‐17/ 2014‐03‐18) | 25 † (2013) | 26 † (2013) |
27 † (2014‐02) |
28 (2014‐03‐18) |
||||||
Other Clients | ||||||||||||||||||||||||||||||||||
Mozilla Application Suite † | 0.6–1.8a6–1.7.13 † (2000/2006) |
1.8b1 † (2005) |
||||||||||||||||||||||||||||||||
Mozilla SeaMonkey | 1.0a–1.0.9 † (2005/2007) |
1.1a–1.1.19 † (2006/2010) |
2.0a1–2.0.12 (2008‐10‐05/ 2011‐03‐02) |
2.1a1–2.1 (2010‐05‐18/ 2011‐06‐10) |
2.2b1–2.2 (2011‐06‐22/ 2011‐07‐07) |
|||||||||||||||||||||||||||||
Mozilla Thunderbird | 0.1–1.0.8 † (2003/2006) |
1.1a1–1.5.0.14 † (2005/2007) |
2.0a1–2.0.0.24 † (2006/2010) |
3.0a1, 3.0a2 † (2008) |
3.0a3–3.0.11 † (2008/2010) |
3.1a1–3.1.12 (2010‐02‐03/ 2011‐08‐16) |
3.3a1–3.3a3 (2010‐11‐23/ 2011‐01‐20) |
5.0b1–5.0 (2011‐06‐02/ 2011‐06‐28) |
||||||||||||||||||||||||||
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 | ||||||||||||||||||||||||||||||
NihonSoft firecat | 1.0.x Beta4 (2008) |
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 | 9.0.16421 (Chakra) | 10.0.16578 | 11 | ||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
JScript .NET | 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 † (1997‐11) |
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) |
9.0 for Vista SP2+ / Server 2008 (2011‐03‐14) |
10 for Windows 8 (2012‐08) | 11.0.16518 (2013‐10) | ||||||
Web Servers | |||||||||||||||||||
Microsoft Internet Information Server/Services | 4.0 † (1998/2002)> |
5.1–6.0 † (2000/2005) |
7.0 (2008) |
7.5 (2009) |
|||||||||||||||
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) |
7 | 8 (2012‐10‐26) | 8.1 (2013‐10‐17) | ||||||||||
Microsoft Windows Server | 2003 (2003‐04) |
2008 (2008‐02) |
2008 R2 (2009‐09) |
2008 | 2008 R2 | ||||||||||||||
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 | 2.2 | 2.3 | 2.4 | 2.5 | 3.0 | 3.1 | 3.2 | 3.3 | 3.4 | 3.5 | 3.6 | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | 3.12 | 3.13 | 3.14 | 3.15 | 3.16 | 3.17 | 3.18 | 3.19 | 3.20 | 3.21 | 3.22 | 3.23 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Google Chrome | 0.2–1.0 (2008 CE) |
2.0 (2009) |
3.0 (2009) |
4.0.249–4.1.249 (2010) |
5.0.307 (2010) |
5.0.342–5.0.375 (2010) |
6 (2010) |
7 (2010) |
8 (2010) |
9 (2011) |
10 (2011) |
11 (2011) |
12 (2011) |
13 (2011) |
14 (2011) |
15 (2011) |
16 (2011) |
17 (2012) |
18 (2012) | 19 (2012) | 20 (2012) | 21 (2012) | 22 (2012) | 23 (2012) | 24 (2013) | 25 (2013) | 26 (2013) | 27 (2013) | 28 (2013) | 29 (2013) | 30 (2013) | 31 (2013) | 32 (2014‐01) | 33 (2014‐02) |
JSC 48–312.6 | 412–419.13 | 522–523 | 525.13–525.20 | 525.19–525.21 | 525.27–525.28 | 530.17–530.19 | 531.9 | 531.21 | 531.22.7 | 533.16–533.19 | 533.16–534.48 | 534.51–534.53 | 534.54–534.59 | 536.25–537.73 | 537.71–537.73 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Apple Safari | 0.8–1.3.2 † (2003/2006 CE) |
2.0.x † (2005/2006) |
3.0.x † (2007) |
3.1–3.1.1 † (2008) |
3.1.2–3.2 † (2008) |
3.2.1–3.2.3 † (2008/2009) |
4.0–4.0.2 † (2009) |
4.0.3 † (2009) |
4.0.4 † (2009) |
4.0.5 † (2010) |
4.1.x † (2010) |
5.0–5.1 † (2010/2011) |
5.1.1–5.1.3 † (2011/2012) |
5.1.4–5.1.10 † (2012/2013) |
6.0–6.1.1 (2012‐07‐25/ 2013‐12‐16) |
7.0–7.0.1 (2013‐10‐22/ 2013‐12‐16) |
Opera ECMAScript 3.60 | 5.02 | 6.06 | 7.02 | 8.0 | 9.27 | 9.52 | 9.62 | 9.64 | 10.10 | 10.50 | 10.51 | 10.54 | 10.63 | 11.50 | 11.60–12.15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Implementations | ||||||||||||||||
Linear A | Linear B | Futhark | Carakan † | |||||||||||||
Layout Engines | ||||||||||||||||
Elektra | Presto 1.0 | 2.0 | 2.1 | 2.1.1 | 2.4 | 2.5 | 2.6 | 2.7 † | ||||||||
Web Browsers | ||||||||||||||||
Opera Browser | 3.60 † (1999‐05) |
5.02 † (2000‐12) |
6.06 (2001‐11) |
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.50 (2010‐03‐02) |
10.51 (2010‐03‐22) |
10.54 (2010‐06‐21) |
10.63 (2010‐10‐12) |
11.50 (2011‐06‐28) |
11.60–12.15 (2011‐12‐06/ 2013‐04‐04) |
ActionScript 1.0 | 2.0 | 3.0 | |
---|---|---|---|
3)↑ Version information from Macromedia and Wikipedia | |||
Macromedia Flash | 5.0–MX (2000/2003) | 7.1.1 (MX 2004) (2004/2006) | |
Macromedia/Adobe Flash Player | 2–6 (1997/2002‐03) | 7–8 (2003‐09/2005‐08) | 9 (2006-06)— |
Adobe Flex | 2.0 (2006-06)— |
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–5.1 | 6 ("Harmony", Working Draft) |
|
---|---|---|---|---|---|---|
1997‐06 | 1998‐08 | 1999‐12/2000‐03 | 2000‐08/2003‐06/2008 | 2009‐04/2009/12 | since 2009‐04 | |
ActionScript | 2.0 (2004/2006) | 3.0 (2006)— | ||||
JavaScript | 1.1, 1.3, 1.4 | 1.5–1.8.1.x | 2.0 | 1.8.1–14 (2008‐05/2012‐07‐17) | 15 (2012‐08‐28)— | |
JavaScriptCore | 48–? | ? | ? | 528–537.70 (2009‐08/2013) | 537.71 (2009‐08)— | |
JScript | 1.0 (1996) | 5.5–5.7 (2000/2008‐03) | 5.8 (2008‐08)— | |||
JScript .NET | 7.0–10.0 (2000/2010) | |||||
KJS | 1.0 | 4.6.5– | ||||
Opera | 6.0 (2001-12) | 11.60–12.15 (2011‐12‐06/2013‐04‐04) | ||||
V8 | 0.3 | 1.3.12–3.15.1 (2009‐09‐22/2012‐11‐06) | 3.15.2 (2012-11-12)— |
ECMAScript for XML (E4X) | |
---|---|
June 2004 | |
ActionScript | 2.0–3 |
JavaScript | 1.6–20 |
JavaScriptCore | - |
JScript | - |
JScript .NET | - |
KJS | - |
Opera | - |
V8 | - |