JavaScript

De la Viquipèdia, l'enciclopèdia lliure
No s'ha de confondre amb Java (llenguatge de programació).
Infotaula de llenguatge de programacióJavaScript
Tipusllenguatge script, llenguatge de programació basat en prototips, llenguatge de programació imperatiu, llenguatge de programació funcional, event-driven programming language (en) Tradueix, plataforma informàtica, llenguatge interpretat, llenguatge de programació multiparadigma, llenguatge de programació, llenguatge de programació estricte i llenguatge de programació d'alt nivell Modifica el valor a Wikidata
Data de creaciómaig 1996 Modifica el valor a Wikidata
DissenyBrendan Eich Modifica el valor a Wikidata
EpònimJava Modifica el valor a Wikidata
Paradigma de programacióprogramació funcional, programació genèrica, programació orientada a aspectes, programació orientada a events, Programació basada en prototips i llenguatge imperatiu Modifica el valor a Wikidata
Darrera versió estableECMAScript 2023 ()
ECMAScript 2025 () Modifica el valor a Wikidata
Influenciat perScheme, Self, Java, C, LiveScript, Lua, Perl, awk, HyperTalk i Python Modifica el valor a Wikidata
Extensió dels fitxersjs Modifica el valor a Wikidata
Etiqueta d'Stack ExchangeEtiqueta Modifica el valor a Wikidata
Pàgina webecma-international.org… Modifica el valor a Wikidata

JavaScript és un llenguatge script basat en objectes implementat originàriament per Netscape Communications Corporation, i que va derivar en l'estàndard ECMAScript.[1][2][3] És conegut sobretot pel seu ús en pàgines web, però també s'utilitza en altres aplicacions.[2]

Malgrat el seu nom, JavaScript no deriva del llenguatge de programació Java,[4] 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[modifica]

É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[4]), se sol utilitzar per a generar codi HTML[2] i és un llenguatge de programació interpretat.[5]

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.[6] 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.[7]

Història[modifica]

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.[1]

El 1995, Brendan Eich[2] va desenvolupar en Netscape Corporation[1] la primera versió d'este llenguatge sota el nom Mocha, rebatejat LiveScript i finalment Javascript.[4] 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[modifica]

Aquest programa escriu "Hola món" al dispositiu de sortida per defecte,

 document.write('Hola, món!');

amb una alerta,

 alert('Hola, món!');

a la consola del navegador i a l'entorn Node.js

console.log('Hola, món!');

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.
rhino --help
  • Per a l'Android cal instal·lar el paquet SL4A (Scripting Layer for Android)[8] i seguidament el "Rhino for Android" (a la mateixa web).

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

java -jar js.jar

Característiques[modifica]

Generals[modifica]

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".

Sintaxi[modifica]

Comentaris[modifica]

 // comentari fins a fi de línia
 /* comentari 
 multilínia
 */

Blocs[modifica]

'{' instrucció ';' instr. '}'

Tipus i valors[modifica]

Undefined
 undefined // valor de variables no definides
 // i dels paràmetres formals de funcions, absents a la crida

 if (nom_var == undefined) nom_var = valor_per_defecte ;

 var excepció_manca_param = "manca paràmetre" ;
 var doble = function (x) { if (x == undefined) throw excepció_manca_param ;
 else return 2 * x; 
 } 
 try {
 doble() ;
 }
 catch (error) {
 if (error == excepció_manca_param) alert("Error: "+error) ;
 }
Null
null
Boolean

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

 false, true
 Boolean(<expressió_de_qualsevol_tipus>); // conversió a booleà
 // (els elem. neutres de la suma o concatenació avaluen a fals)
Number, real de 64 bits

Operacions segons la norma IEEE 754.

 0 -1 1.5 -2E-3 NaN +Infinity -Infinity 
 // NaN és Not-a-Number (No-Numèric) com ara 0/0,
 // ''Infinity'' indica sobreeiximent en el càlcul
 Number(<expressió_de_qualsevol_tipus>); // conversió a numèric 

 parseInt(string) // llegeix un enter
 // parseInt("") == NaN
 // parseInt("1.5") == 1
 // parseInt("0xA") == 10 // llegeix hexadecimal
 parseFloat(string) // llegeix un real
 // parseFloat("1.2") == parseFloat("12E-1")
 // parseFloat("1.2.3") == 1.2
 // parseFloat("E1") == NaN

 isNaN(number) // és resultat de 0/0 ? (NaN: No-Numèric)
 isFinite(number) // (negat) hi ha hagut sobreiximent ?, per ex. 1/0 == Infinity (no dispara
 // div-per-zero)
String
 "" "abc" 'abc'
 // conversió a cadena de caràcters de l'expressió
 String(<expressió_de_qualsevol_tipus>);

Operacions:

 str1 + operand === str1.concat(String(operand)) // concatenació 
 operand + str2 === String(operand).concat(str2) // concatenació
 "c".localeCompare("d") === -1 // {1 (>), 0 (==), -1 (<), o primera diferència no nul·la de charCodeAt en els caràcters}
 "0123".substr (1, 3) === "123" // str.substr(inici, llargada)
 "0123".substring (1, 3) === "12" // str.substring(inici, índex_aturador)
 "0123".slice (1, 3) === "12"
 "0123".charAt(1) === "1"
 "0123".charCodeAt(1) === 49 // Codi decimal del caràcter
 "18/11/2011".split ("/") === ["18", "11", "2011"]
 "18/11/2011".split ("/", 2) === ["18", "11"] // amb límit de particions
 "a//".indexOf("/") === 1
 "a//".lastIndexOf("/") === 2
 "abc".replace("b","p") === "apc"
 "abcd".search("cd") === 2 // (-1) en cas de fracàs en la cerca.

 String.fromCharCode(64) === "@" 
 "@".charCodeAt(0) === 64
Object

Objecte[modifica]

Conjunt de propietats amb valor associat. (diccionari propietat → valor)

 var obj = { propietat1: valor1, propietat2: valor2, ..}

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).

propietats de l'objecte Object, prototipus inicial dels objectes nous[modifica]

 obj.hasOwnProperty ('prop') // consulta si l'objecte té la prop. específicament, 
 // i no per delegació al prototipus
 obj.isPrototypeOf (altre_obj) // si és prototipus de
 obj.propertyIsEnumerable ('prop') // si la prop. sortirà llistada en un bucle 'for(' prop_var
 //'in' obj ')'
 obj.toString() // representació estàndard
 obj.toLocaleString() // representació segons ''Locale'' (característiques de cultura 
 // local)
 obj.valueOf() // retorna el seu valor d'instància (''this'')

Number[modifica]

 obj = new Number(expr.) // amb new el nombre admet propietats a més del valor

 obj = new Number(5)
 obj.una_altra_prop = "abc"
  • l'objecte Number conté valors típics per contrastar
 Number.MAX_VALUE // 1.7976931348623157 × 10^308
 Number.MIN_VALUE // 5 x 10^-324
 Number.NaN // valor ''Not-a-Number'' (cat:No-Numèric), ex.: resultat de 0/0
 Number.POSITIVE_INFINITY // indica "sobreeiximent en operacions de resultat positiu"
 Number.NEGATIVE_INFINITY // indica "sobreeiximent en operacions de resultat negatiu"

String (cadenes de text)[modifica]

 var a = new String("0123") // amb new fem un objecte, podem afegir-li propietats
 var a = "0123" // valor [[escalar_(informàtica)|escalar]], no podem afegir-li propietats

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

Funció[modifica]

 var variable_o_propietat = function (param1, param2, ..) { codi }
 // o també
 function nom_de_funcio (param1, param2, ..) { codi }

Array (vectors)[modifica]