hello friends! new(ish)!

JavaScript: Difference between revisions

From InstallGentoo Wiki v2
Jump to navigation Jump to search
>Keboler
No edit summary
>Keboler
(Use code templates, change some words, unstub the page)
Line 1: Line 1:
{{Stub}}
<!-- {{Stub}} -->
[[File:Js.png|thumb|Unofficial logo.]]
[[File:Js.png|thumb|Unofficial logo.]]


Line 8: Line 8:
The language was originally named LiveScript, renamed to JavaScript before it's original release in Netscape Navigator 2.0, and is referred to as ECMAScript usually for the purposes of standardisation aside other uses possibly due to the fact that "JavaScript" is a trademark of Oracle.
The language was originally named LiveScript, renamed to JavaScript before it's original release in Netscape Navigator 2.0, and is referred to as ECMAScript usually for the purposes of standardisation aside other uses possibly due to the fact that "JavaScript" is a trademark of Oracle.


In the last few years, since the release of Node.js, a project that uses [[Chromium]]'s V8 JavaScript runtime and includes a set of APIs designed for writing event-based asynchronous servers, the popularity of JavaScript has boomed, with Stack Overflow's 2016 survey of developers finding that 55% of developers surveyed used JavaScript, while it grew impetus for the often idiosyncratic language to be improved (see [[#ECMAScript 6+|ECMAScript 6]]).
In the last few years, since the release of Node.js, a project that uses [[Chromium]]'s V8 JavaScript runtime and includes a set of APIs designed for writing event-based asynchronous servers, the popularity of JavaScript has boomed, with Stack Overflow's 2016 survey of developers finding that 55% of developers surveyed used JavaScript, while it grew impetus for the often idiosyncratic language to be improved (see [[#ECMAScript 6+]]).


== Criticism ==
== Criticism ==
Line 15: Line 15:


=== The language itself ===
=== The language itself ===
JavaScript as a language is quite unsound. Possibly as a result of the language originally being written within 10 days, for a very long time JavaScript only had simple function-level scoping, instead of lexical scoping (within blocks) used by almost every other popular programming language (bar the Bourne shell and Emacs Lisp). JavaScript's typing behaviour is clumsy, making many insane coercions between types compared to saner dynamic/duck typed languages such as Python; this problem led to new <tt>===</tt> and <tt>!==</tt> equality operators that only allow comparison between two values of the same type. JavaScript also has no standard library; it relies on the often disparate APIs in browsers (or Node), contributing to the cross-browser incompatiblity mess.
JavaScript as a language is somewhat unsound. Possibly as a result of the language originally being written within 10 days, for a very long time JavaScript only had simple function-level scoping, instead of lexical scoping (within blocks) used by almost every other popular programming language (bar the Bourne shell and Emacs Lisp). JavaScript's typing behaviour is clumsy, making many insane coercions between types compared to saner dynamic/duck typed languages such as Python; this problem led to new {{ic|1====}} and {{ic|1=!==}} equality operators that only allow comparison between two values of the same type. JavaScript also has no standard library; it relies on the often disparate APIs in browsers (or Node), contributing to the cross-browser incompatiblity mess.


==== ECMAScript 6+ ====
==== ECMAScript 6+ ====
Line 21: Line 21:


The most important and significant introductions include:
The most important and significant introductions include:
* Lexical scoping - ECMAScript 2015 introduces two new keywords, <tt>let</tt> and <tt>const</tt> to replace <tt>var</tt>, as such:
* Lexical scoping - ECMAScript 2015 introduces two new keywords, {{ic|let}} and {{ic|const}} to replace {{ic|var}}, as such: {{bc|<nowiki>let x = 1
<nowiki>let x = 1
{
{
   let x = 2
   let x = 2
Line 29: Line 28:
console.log(x)
console.log(x)
> 2
> 2
> 1</nowiki>
> 1</nowiki>}} {{ic|const}} uses the same scoping rules as {{ic|let}}, but causes the name to be unable to be assigned to another value.
* <tt>const</tt> uses the same scoping rules as <tt>let</tt>, but makes that identifier unable to be assigned to another value.
* Function expressions, akin to lambdas and closures in other programming languages, are common in JavaScript, for example, as callbacks as arguments in asynchronous functions and event handlers. ECMAScript 2015 introduces a new, more concise syntax for function expressions called arrow functions. {{bc|<nowiki>let a = function (a, b, c) {
* Function expressions, akin to lambdas and closures in other programming languages, are common in JavaScript, for example, as callbacks as arguments in asynchronous functions and event handlers. ECMAScript 2015 introduces a new, more concise syntax for function expressions called arrow functions.
<nowiki>let a = function (a, b, c) {
   return a + b + c;
   return a + b + c;
}
}
Line 39: Line 36:
}
}
let nums = [1, 2, 3, 4, 5, 6];
let nums = [1, 2, 3, 4, 5, 6];
let evens = nums.filter(elem => elem % 2 === 0); // Function expressions with one parameter or one expression need not use braces</nowiki>
let evens = nums.filter(elem => elem % 2 === 0); // Function expressions with one parameter or one expression need not use braces</nowiki>}}
* JavaScript once only had range-based C style for loops. An extension, <tt>for (prop in obj)</tt>, loops over the enumerable properties of <tt>obj</tt>, making it unsuitable for looping over collections. ECMAScript 2015 includes a new <tt>for (elem of array)</tt> pattern that iterates over the elements of collections, akin to for loops in Python.
* JavaScript once only had range-based C style for loops. An extension, {{ic|for (prop in obj)}}, loops over the enumerable properties of {{ic|obj}}, making it unsuitable for looping over collections. ECMAScript 2015 introduces a new {{ic|for (elem of array)}} pattern that iterates over the elements of collections, akin to for loops in Python.
Other new additions include standard functions such as <tt>Array.from</tt> for converting pseudo-array types such as <tt>NodeList</tt> and <tt>HTMLCollection</tt>, classes as an alternative to prototype-based object oriented programming, template strings, the <tt>...</tt> operator which acts like <tt>*args</tt> in Python, symbols and Promises, a new asynchronous code paradigm as an alternative to [http://callbackhell.com/ callback hell].
Other new additions include standard functions such as {{ic|Array.from}} for converting pseudo-array types such as {{ic|NodeList}} and {{ic|HTMLCollection}}, classes as an alternative to prototype-based object oriented programming, template strings, the {{ic|...}} operator which acts like {{ic|*args}} in Python, symbols and Promises, a new asynchronous code paradigm as an alternative to [http://callbackhell.com/ callback hell].


Not all ES2015 features have been implemented into browsers and JavaScript runtimes. The progress of implementation has been tabled up [https://kangax.github.io/compat-table/es6/ here].
Not all ES2015 features have been implemented into browsers and JavaScript runtimes. The progress of implementation has been tabled up [https://kangax.github.io/compat-table/es6/ here].

Revision as of 13:16, 4 September 2016

Unofficial logo.

JavaScript (or ECMAScript) is a scripting language that was originally designed for use in the Netscape web browser, but later became a web standard. JavaScript has traditionally been confined to the browser to add interactivity to web pages, but in recent years has been adopted for use in desktop applications through technologies such as GJS and Electron and for server-side use, primarily due to Node.js, but also Rhino.

Creator Brendan Eich has been quoted as saying that Javascript "had to ‘look like Java’ only less so, be Java's dumb kid brother or boy-hostage sidekick. Plus, it had to be done in ten days or something worse than JavaScript would have happened."

The language was originally named LiveScript, renamed to JavaScript before it's original release in Netscape Navigator 2.0, and is referred to as ECMAScript usually for the purposes of standardisation aside other uses possibly due to the fact that "JavaScript" is a trademark of Oracle.

In the last few years, since the release of Node.js, a project that uses Chromium's V8 JavaScript runtime and includes a set of APIs designed for writing event-based asynchronous servers, the popularity of JavaScript has boomed, with Stack Overflow's 2016 survey of developers finding that 55% of developers surveyed used JavaScript, while it grew impetus for the often idiosyncratic language to be improved (see #ECMAScript 6+).

Criticism

Bloat

Many people hate JavaScript. When it began, it was just a neat sort of thing that allowed pages to be animated. However, later on for a number of reasons, including the rise of Web 2.0, JavaScript became a primary element of RUE websites, causing a page that would otherwise be 1MB long in memory and transmission terms to be 40MB with JavaScript.

The language itself

JavaScript as a language is somewhat unsound. Possibly as a result of the language originally being written within 10 days, for a very long time JavaScript only had simple function-level scoping, instead of lexical scoping (within blocks) used by almost every other popular programming language (bar the Bourne shell and Emacs Lisp). JavaScript's typing behaviour is clumsy, making many insane coercions between types compared to saner dynamic/duck typed languages such as Python; this problem led to new === and !== equality operators that only allow comparison between two values of the same type. JavaScript also has no standard library; it relies on the often disparate APIs in browsers (or Node), contributing to the cross-browser incompatiblity mess.

ECMAScript 6+

In recent years, there has been a new initiative to add missing features to the language and fix some of it's problems. Previously these efforts were hampered by Microsoft, but in 2015 ECMAScript 6 was finally finished and standardised as ECMAScript 2015.

The most important and significant introductions include:

  • Lexical scoping - ECMAScript 2015 introduces two new keywords, let and const to replace var, as such:
    let x = 1
    {
      let x = 2
      console.log(x)
    }
    console.log(x)
    > 2
    > 1
    const uses the same scoping rules as let, but causes the name to be unable to be assigned to another value.
  • Function expressions, akin to lambdas and closures in other programming languages, are common in JavaScript, for example, as callbacks as arguments in asynchronous functions and event handlers. ECMAScript 2015 introduces a new, more concise syntax for function expressions called arrow functions.
    let a = function (a, b, c) {
      return a + b + c;
    }
    let b = (a, b, c) => {
      return a + b + c;
    }
    let nums = [1, 2, 3, 4, 5, 6];
    let evens = nums.filter(elem => elem % 2 === 0); // Function expressions with one parameter or one expression need not use braces
  • JavaScript once only had range-based C style for loops. An extension, for (prop in obj), loops over the enumerable properties of obj, making it unsuitable for looping over collections. ECMAScript 2015 introduces a new for (elem of array) pattern that iterates over the elements of collections, akin to for loops in Python.

Other new additions include standard functions such as Array.from for converting pseudo-array types such as NodeList and HTMLCollection, classes as an alternative to prototype-based object oriented programming, template strings, the ... operator which acts like *args in Python, symbols and Promises, a new asynchronous code paradigm as an alternative to callback hell.

Not all ES2015 features have been implemented into browsers and JavaScript runtimes. The progress of implementation has been tabled up here.

Security

Security risks in JavaScript are extensive, through flaws in the language and exploits in JavaScript runtimes. JavaScript can also be used to make a keylogger.

Software freedom

The method in which JavaScript is executed upon page load without the user's consent is an affront to software freedom - the Javascript Trap. LibreJS is a web plugin designed by the FSF to block non-free JavaScript.