# JavaScript

* No s'ha de confondre amb Java (llenguatge de programació).
JavaScript és un llenguatge script basat en objectes implementat originàriament per Netscape Communications Corporation, i que va derivar en l'estàndard ECMAScript. És conegut sobretot pel seu ús en pàgines web, però també s'utilitza en altres aplicacions.
Malgrat el seu nom, JavaScript no deriva del llenguatge de programació Java, però tots dos compartixen una sintaxi similar inspirada en el llenguatge C. Semànticament, JavaScript és més pròxim als llenguatges Self i ActionScript (basat també en l'ECMAScript). El nom "JavaScript" és una marca registrada per Oracle Corporation.

## Característiques

És un llenguatge de programació basat en objectes i de guió (també conegut com a script) que suporta els principis de polimorfisme, herència per delegació), abstracció i encapsulació. És sensible a les majúscules i minúscules, està orientat a esdeveniments (principalment solen implementar-se als botons del codi HTML), se sol utilitzar per a generar codi HTML i és un llenguatge de programació interpretat.
Quan s'utilitza com a llenguatge al costat-client en l'àmbit web, els scripts s'executen al navegador web, servint com a extensió de les capacitats del llenguatge de la web HTML. La interacció entre JavaScript, el codi HTML i el navegador web es fa possible mitjançant un conjunt d'objectes que representen l'estructura d'una pàgina web en forma d'arbre, anomenat Model d'Objectes del Document.

## Història

El 1993 el National Center for Supercomputing Applications creà el navegador web Mosaic. Per a explotar les possibilitats de la web, que estava en desenvolupament, es fundà l'empresa Netscape Corporation. Netscape creà el navegador Netscape Navigator. Netscape es donà compte de la necessitat de que el contingut web havia de ser més dinàmic. Així el 1995 contractà a Brendan Eich.
El 1995, Brendan Eich va desenvolupar en Netscape Corporation la primera versió d'este llenguatge sota el nom Mocha, rebatejat LiveScript i finalment Javascript. Aquest últim canvi de nom va coincidir amb la inclusió de la tecnologia Java per part del navegador web Netscape. La primera versió del llenguatge es va presentar el desembre de 1995 a la versió 2.0B3 del navegador Netscape. Microsoft implementà més tard una versió amb el nom JScript, però sovint també se l'anomena Javascript.
En un principi, s'usava a pàgines web HTML, per realitzar feines i operacions al marc de l'aplicació client servidor. Amb l'aparició de la Web 2.0, Javascript s'ha convertit en un veritable llenguatge de programació que aporta la potència de càlcul al navegador per augmentar la usabilitat d'aplicacions web amb tècniques avançades com AJAX o JCC.
El 1997 els autors van proposar Javascript com a estàndard de l'European Computer Manufacturers Association ECMA, que tot i el seu nom no és europeu, sinó internacional, amb la seu a Ginebra. El juny de 1997 va ser adoptat com un estàndard ECMA, amb el nom ECMAScript. Poc després també va ser un estàndard ISO.
JScript és la implementació del ECMAScript de Microsoft, molt similar al JavaScript de Netscape, però amb certes diferències al model d'objecte del navegador que fan les dues versions incompatibles.
Per evitar aquestes incompatibilitats, el World Wide Web Consortium va dissenyar l'estàndard Document Object Model (DOM, o Model d'Objectes del Document en català), que incorpora el Konqueror, les versions 6 d'Internet Explorer i Netscape Navigator, Opera versió 7, i Mozilla des de la seva primera versió.

## Programa d'exemple

Aquest programa escriu "Hola món" al dispositiu de sortida per defecte,
amb una alerta,
a la consola del navegador i a l'entorn Node.js
Per experimentar fora del navegador podeu descarregar-vos el motor Javascript de Mozilla
* Per a Linux podeu instal·lar el paquet de la distribució, compilat a codi màquina.
* Per a l'Android cal instal·lar el paquet SL4A (Scripting Layer for Android) i seguidament el "Rhino for Android" (a la mateixa web).
* Per a altres sistemes, el podeu descarregar per a la màquina Virtual Java d'aquí.
Un cop descarregat i desempaquetat, obriu una finestra de comandes, canvieu directori a la carpeta del paquet obert i activeu el Rhino sobre JVM amb

## Característiques
### Generals

Les relacions d'herència entre objectes no són per classes i subclasses, sinó individuals entre un objecte i un altre, anomenat el seu prototipus (relacionats mitjançant la propietat prototype), al qual es deleguen les operacions i propietats que el primer desconeix (no pròpies o específiques).
* Només es pot establir un prototipus mitjançant una funció constructora.
* Els prototipus poden formar una cadena que ha de ser finita (no hi pot haver cicles).
Vegeu l'exemple més avall a "Creació d'objectes".

### Tipus i valors
#### Undefined
#### Boolean

Operacions segons l'Àlgebra de Boole: (! :not),(&& :and),(|| :or)

#### Number, real de 64 bits

Operacions segons la norma IEEE 754.

#### String

Operacions:

#### Object
### Objecte

Conjunt de propietats amb valor associat. (diccionari propietat → valor)
new devant d'un constructor genera objectes, sense new, constructors com ara String no estan obligats, segons l'estàndard, a generar un objecte, sinó només la conversió al tipus primitiu (cas de booleans i nombres) o escalar (cas de tires de caràcters).

#### Number

* l'objecte Number conté valors típics per contrastar

#### String (cadenes de text)

mètodes (La majoria de mètodes de String no tornen un objecte String sinó un valor primitiu (escalar) de tipus String)

#### Date (data)

El tipus Date permet el càlcul amb dates amb una aproximació d'un mil·lisegon.
El temps, segons l'especificació ECMAScript, es mesura en mil·lisegons des de l'1 de gener de 1970 (Època Unix). Els segons intercalars no hi són comptats.
Les dates són una extrapolació del temps en mil·lisegons al Calendari gregorià
Alguns d'aquests mètodes poden desconcertar pel nom o rang de valors:

#### RegExp (expressió regular)

propietats:
mètodes

#### Math

Biblioteca d'operacions numèriques:

### Creació d'objectes
#### amb una funció constructora

Quan una funció es fa servir amb new s'anomena Constructor i inicialitza l'objecte creat amb new.

#### amb mecanisme d'herència per delegació a un altre objecte

Una funció Constructora d'objectes pot especialitzar un altre objecte si l'assigna a la propietat prototype de la funció.
this a la dreta d'una assignació equival al super dels llenguatges orientats a objectes per demanar el valor del mètode de la superclasse

#### instanceof
### L'objecte Global

Valors i funcions globals definits a la norma ECMA262 edició 3a.:

### Operadors
#### Operadors en infix (binaris)

operadors multiplicatius
operadors additius
operadors de bits
operadors d'igualtat
operadors relacionals
operador condicional
operadors d'assignació

##### operador coma
## Biblioteques Javascript rellevants
### Biblioteca informàtica

* React
* Vue.js
* AngularJS

### Gestió d'esdeveniments

* jQuery Consulta i tractament d'esdeveniments d'objectes del document segons el model DOM

### Programació funcional

* wu
* Underscore
* osteele

### Programació reactiva funcional

* flapjax permet establir dependències per alterar característiques del codi DOM a conseqüència de canvis de valor de camps (Behaviours) o successions d'esdeveniments (Event streams)
* Elm: llenguatge de programació amb sintaxi quasi Haskell amb tractament unificat d'esdeveniments i senyals (Behaviours) que compila a JavaScript. Parteix d'un nus buit de Html generant-hi l'estructura per combinació.

### Orientació a objectes

* MooTools (My Object-Oriented Tools)

## Relacionat
### JSON

    (acrònim de JavaScript Object Notation) Serialització d'objectes Javascript

## Javascript als Navegadors
### Firefox de Mozilla

* Javascript a Mozilla (anglès) Suport de Javascript al Firefox, Thunderbird i altres projectes.

### Internet Explorer

* Microsoft - Jscript (anglès) Versió Javascript de Microsoft
* Versions i característiques de Jscript que suporten les diferents versions de l'Internet Explorer (anglès)

### Google Chrome

* Javascript API al Chrome (anglès)

### Safari de l'Apple

* Javascript al Safari d'Apple (anglès)

### Opera

* Referència de Javascript a Òpera(anglès)
* Articles sobre Javascript al navegador Òpera Arxivat 2011-11-11 a Wayback Machine.(anglès)

## Javascript com a rerefons de compiladors d'altres llenguatges
### Elm (programació reactiva funcional)

Llenguatge per generar aplicacions gràfiques al navegador (GUI) amb sintaxi Haskell, compilable a JavaScript.
Antigament seguia un model de programació reactiva funcional, però l'han canviat a un model MVC (Model-Vista-Controlador) més pròxim al ReactJS.

### Java a Javascript

Una de les característiques del Google Web Toolkit és la possibilitat de crear l'aplicació en Java i compilar-la a Javascript

### Haskell a Javascript

* Fay: Compilador de Haskell a Javascript que admet un subconjunt del llenguatge Haskell i tipus específics per a Javascript
* JMacro - Generador de Javascript sintàcticament correcte
* Javascript amb tipatge fort, com a biblioteca Haskell de llenguatge incrustat (EDSL)
* PureScript compilador per una versió de Haskell amb avaluació estricta, amb algunes diferències de sintaxi.

### Scala a Javascript

* ScalaJS: compilador a JavaScript.

### OCaml a Javascript

* OcamlJs segons aquest article

### Scheme a Javascript

* Scheme2Js de l'INRIA (Institut nacional francès de recerca en informàtica)
* CPSCM traductor a Google code de Scheme a Javascript basat en el mètode de compilació CPS (Continuation Passing Style).

### Smalltalk a Javascript

* ST2JS

## Vegeu també

* CoffeeScript
* WebAssembly

## Referències

* 1 2 3 Rauschmayer, Axel. «Chapter 4. How JavaScript Was Created». A: Speaking JavaScript: An In-Depth Guide for Programmers. Sebastopol, Califòrnia: O'Reilly, 2015. ISBN 9781449365035. Arxivat 2020-02-27 a Wayback Machine.
* 1 2 3 4 Pérez Castaño, 2014, p. 29.
* ↑ Stefanov, Stoyan. JavaScript patterns. Sebastopol, CA: O'Reilly, 2010, p. 5. ISBN 9781449396947. «The core JavaScript programming language [...] is based on the ECMAScript standard, or ES for short.»
* 1 2 3 Pérez Castaño, 2014, p. 30.
* ↑ Pérez Castaño, 2014, p. 31.
* ↑ Pérez Castaño, 2014, p. 32.
* ↑ Pérez Castaño, 2014, p. 34-35.
* ↑ Scripting Layer for Android(anglès) Capa que permet utilitzar Javascript, Python, i altres llenguatges de guió
* ↑ Mozilla - Rhino, motor de Javascript (anglès)
* 1 2 3 Especificació ECMAScript - Objecte Date(anglès)
* ↑ Biblio Wu de prog. funcional Arxivat 2011-03-02 a Wayback Machine.(anglès)
* ↑ Biblio Underscore de prog. funcional Arxivat 2011-05-03 a Wayback Machine.(anglès)
* ↑ Biblio. Osteele de prog. funcional Arxivat 2019-07-21 a Wayback Machine.(anglès)
* ↑ Flapjax
* ↑ A farewell to FRP(anglès) Adéu a la FRP
* ↑ Google Web Toolkit (pàgina inicial)(anglès)
* ↑ Compilant Java a Javascript(anglès)
* ↑ El llenguatge Fay(anglès)
* ↑ Jmacro(anglès)
* ↑ biblioteca Haskell de Javascript com a llenguatge incrustat (EDSL)(anglès)
* ↑ ScalaJS(anglès)
* ↑ OCamlJs (pàgina al viver de projectes Google code)(anglès)
* ↑ OCamlJs - El compilador de OCaml a Javascript(anglès)
* ↑ Scheme2Js(anglès)
* ↑ CPSCM Scheme a Javascript(anglès)
* ↑ ST2JS - Smalltalk a Javascript(anglès)

## Bibliografia

* Pérez Castaño, Arnaldo. JavaScript Fácil. Barcelona: Marcombo, 2014, p. 9. ISBN 978-84-267-2168-6.

## Estàndards ECMAScript, nom oficial de JavaScript

* ECMAScript Official Website Arxivat 2007-06-11 a Wayback Machine. (anglès)
** ECMA-262 (anglès)
*** ECMA-262 ECMAScript Language Specification 3rd edition (December 1999) (anglès)
*** ECMAScript Language Specification, Edition 3 Final, 24-Mar-00 (anglès)
*** ECMA-262 ECMAScript Language Specification 5th edition (December 2009) (anglès)
** ECMA-290 ECMAScript Components Specification (June 1999) (anglès)
** ECMA-327 ECMAScript 3rd Edition Compact Profile (June 2001) (anglès)
** ECMA-357 ECMAScript for XML (E4X) Specification (June 2004) (anglès)

## Enllaços externs

* Guia de JavaScript 1.5 (anglès)
* W3Schools.com - Guia en línia de Javascript (anglès)
* The World of ECMAScript (anglès) Mapa de ECMAScript segons John Resig