Malgrat el seu nom, JavaScript no deriva delllenguatge de programació Java,[4] però tots dos compartixen una sintaxi similar inspirada en elllenguatge C. Semànticament, JavaScript és més pròxim als llenguatgesSelf iActionScript (basat també en l'ECMAScript). El nom "JavaScript" és una marca registrada perOracle Corporation.
Quan s'utilitza com a llenguatge alcostat-client en l'àmbit web, els scripts s'executen alnavegador web, servint com a extensió de les capacitats del llenguatge de la web HTML.[6] La interacció entre JavaScript, el codi HTML i elnavegador web es fa possible mitjançant un conjunt d'objectes que representen l'estructura d'una pàgina web en forma d'arbre, anomenatModel d'Objectes del Document.[7]
El 1995, Brendan Eich[2] va desenvolupar enNetscape Corporation[1] la primera versió d'este llenguatge sota el nomMocha, rebatejatLiveScript i finalment Javascript.[4] Aquest últim canvi de nom va coincidir amb la inclusió de la tecnologiaJava per part delnavegador 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 nomJScript, però sovint també se l'anomenaJavascript.
En un principi, s'usava a pàgines webHTML, per realitzar feines i operacions al marc de l'aplicació client servidor. Amb l'aparició de laWeb 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 comAJAX oJCC.
El 1997 els autors van proposar Javascript com a estàndard de l'European Computer Manufacturers AssociationECMA, que tot i el seu nom no és europeu, sinó internacional, amb la seu a Ginebra. El juny de1997 va ser adoptat com un estàndard ECMA, amb el nomECMAScript. Poc després també va ser un estàndardISO.
JScript és la implementació del ECMAScript deMicrosoft, molt similar al JavaScript de Netscape, però amb certes diferències al model d'objecte del navegador que fan les dues versions incompatibles.
Les relacions d'herència entre objectes no són per classes i subclasses, sinó individuals entre un objecte i un altre, anomenat el seuprototipus (relacionats mitjançant la propietatprototype), al qual esdeleguen 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).
undefined// valor de variables no definides// i dels paràmetres formals de funcions, absents a la cridaif(nom_var==undefined)nom_var=valor_per_defecte;varexcepció_manca_param="manca paràmetre";vardoble=function(x){if(x==undefined)throwexcepció_manca_param;elsereturn2*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,trueBoolean(<expressió_de_qualsevol_tipus>);// conversió a booleà// (els elem. neutres de la suma o concatenació avaluen a fals)
0-11.5-2E-3NaN+Infinity-Infinity// NaN és Not-a-Number (No-Numèric) com ara 0/0,// ''Infinity'' indica sobreeiximent en el càlculNumber(<expressió_de_qualsevol_tipus>);// conversió a numèricparseInt(string)// llegeix un enter// parseInt("") == NaN// parseInt("1.5") == 1// parseInt("0xA") == 10 // llegeix hexadecimalparseFloat(string)// llegeix un real// parseFloat("1.2") == parseFloat("12E-1")// parseFloat("1.2.3") == 1.2// parseFloat("E1") == NaNisNaN(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
Conjunt de propietats amb valor associat. (diccionari propietat → valor)
varobj={propietat1:valor1,propietat2:valor2,..}
new devant d'un constructor genera objectes, sensenew, constructors com ara String() no estan obligats, segons l'estàndard, a generar un objecte, sinó només la conversió al tipus primitiu (cas debooleans i nombres) oescalar (cas de tires de caràcters).
propietats de l'objecte Object, prototipus inicial dels objectes nous
obj.hasOwnProperty('prop')// consulta si l'objecte té la prop. específicament,// i no per delegació al prototipusobj.isPrototypeOf(altre_obj)// si és prototipus deobj.propertyIsEnumerable('prop')// si la prop. sortirà llistada en un bucle 'for(' prop_var//'in' obj ')'obj.toString()// representació estàndardobj.toLocaleString()// representació segons ''Locale'' (característiques de l'entorn// local)obj.valueOf()// retorna el seu valor d'instància (''this'')
obj=newNumber(expr.)// amb new el nombre admet propietats a més del valorobj=newNumber(5)obj.una_altra_prop="abc"
l'objecteNumber conté valors típics per contrastar
Number.MAX_VALUE// 1.7976931348623157 × 10^308Number.MIN_VALUE// 5 x 10^-324Number.NaN// valor ''Not-a-Number'' (cat:No-Numèric), ex.: resultat de 0/0Number.POSITIVE_INFINITY// indica "sobreeiximent en operacions de resultat positiu"Number.NEGATIVE_INFINITY// indica "sobreeiximent en operacions de resultat negatiu"
vara=newString("0123")// amb new fem un objecte, podem afegir-li propietatsvara="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)
El tipus Date permet el càlcul amb dates amb una aproximació d'unmil·lisegon.[10]
El temps, segons l'especificació ECMAScript, es mesura en mil·lisegons des de l'1 de gener de 1970 (Època Unix). Elssegons intercalars no hi són comptats.[10]
vara=newDate()// Ara// inicialitzacióvara=newDate('Jan 10, 2009 12:01:02')// amb text interpretat com data/hora localvara=newDate(any,mes[,dia[,hora[,minuts[,segons[,ms]]]]])// amb hora localvara=Date.UTC(any,mes[,dia[,hora[,minuts[,segons[,ms]]]]])// amb hora UTCa.getTime()// valor intrínsec (this) de l'objecte Date// (mil·lisegons des de l'[[hora Unix|època Unix]])a.getTimezoneOffset()// valor segons l'ajustatge del sistema op.
Alguns d'aquests mètodes poden desconcertar pel nom o rang de valors:
// camps resultat de l'extrapolació al Calendari Gregoriàa.getDate()// dia numèric del mes, rang 1..28..a.getDay()// dia numèric de la setmana rang 0..6a.getMonth()// mes numèric, rang 0..11a.getYear()// obsolet!!, any des de 1900.<ref>[http://download.oracle.com/javase/1,5.0/docs/api/java/util/Date.html#getYear() Java API - Date.getYear()] mètode obsolet!!</ref>a.getFullYear// any completa.getHours()getMinutes()getSeconds()getMilliseconds()// funcions hora [[UTC]] substituint el prefix get...() per getUTC...()
stra.source// cadena patrónuma.lastIndex// posició on començar el proper intent d'encaixar, inicialment 0boola.global// ''senyal'' g -- (cerca múltiple) actualitza la// propietat lastIndex per a la cerca següentboola.ignoreCase// ''senyal'' i -- ignora caixa majús/minboola.multiline// ''senyal'' m -- ignora salts de línia
mètodes
a.test(str)// equival a: a.exec(str) != nullres=a.exec(str)// executa l'expressió regular contra la cadena str// fins a aconseguir un encaix/* el resultat és o null (fracàs), o en cas d'èxit, un objecte Array amb propietats addicionals -- res.length : nombre d'encaixaments corresp. a tot el patró més grups assenyalats pels parèntesis -- res[ 0] : subcadena encaixada corresponent a tot el patró -- res[ 1..length-1] : subcadenes corresponents a grups -- res.index : posició d'inici de l'encaix trobat a str -- res.input : valor de la cadena d'entrada str -- cas del ''senyal'' "g", a.lastIndex s'incrementa amb la llargada del resultat de l'encaix res[0], preparat per a la cerca de l'encaix consecutiu */
Una funció Constructora d'objectes pot especialitzar un altre objecte si l'assigna a la propietatprototype de la funció.
// afegim la propietat ''prototype'' a la funció plantilla ''Alumne'' abans de fer-ne instànciesAlumne.prototype=objJoanPersona// previ a la instanciació dels alumnesvarobjJoanAlumne=newAlumne('Escola A',36,["Javascript","Java"]);objJoanAlumne.nom// resultat, per delegació al prototipus objJoanPersona, 'Joan'objPereAlumne=newAlumne('Escola A',135,["Haskell","OCaml"]);objPereAlumne.nom='Pere'// en assignar, genera una prop. específica de l'obj.,// l'objecte prototipus no queda afectat.
this a la dreta d'una assignació equival alsuper dels llenguatgesorientats a objectes per demanar el valor del mètode de la superclasse
varClasseArrel=function(str){this.prop=str}// funció constructoravarobj1=newClasseArrel("abc")varClasseDerivada=function(str){this.prop=this.prop+str// concatena la propietat "prop" del prototipus amb la var. "str"}ClasseDerivada.prototype=obj1// ref. a una instància de ClasseArrelvarobj2=newClasseDerivada("def")>obj1.prop"abc">obj2.prop"abcdef"
Valors i funcions globals definits a la norma ECMA262 edició 3a.:
NaN (acrònim de Not_a_Number, en català: No_Numèric), Infinity, undefined
eval(x)parseInt(string)// llegeix un enter de l'string// parseInt("") == NaN// parseInt("1.5") == 1// parseInt("0xA") == 10 // llegeix hexadecimalparseFloat(string)// llegeix un real// parseFloat("1.2") == parseFloat("12E-1")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)encodeURI(uri)// substitueix en una [[URI]] determinats caràcters per seqüències d'escapament// ASCII amb % seguit de 2 dígits hexadecimals, com ara %3DdecodeURI(uri)// inversa...
+ (si un operand és String, concatena amb la conv. a String de l'altre)-
operadors de bits
<< (desplaçament a l'esquerra) (0x80000000 << 1 == 0)>> (desplaçament a la dreta, que manté el signe)>>> (desplaçament sobre valor natural)& (and)^ (xor)| (or)
operadors d'igualtat
== != (igualtat convertint tipus si cal) // "12" == 12 dona true === !== (igualtat estricta: sense conversió de tipus) // "12" === 12 dona false
operadors relacionals
< <= > >=instanceof (objecte instanceof plantilla_de_classe)in (propietat in objecte = objecte té la prop.)
flapjax[14] 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 quasiHaskell amb tractament unificat d'esdeveniments i senyals (Behaviours) que compila a JavaScript. Parteix d'un nus buit deHtml generant-hi l'estructura per combinació.
↑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.»