Salta el contingut

Introducció al llenguatge JavaScript

Característiques de JavaScript

JavaScript és un llenguatge de programació interpretat dialecte de l'estàndard ECMAScript.
La seva aplicació principal és la de programació dins de pàgines web en entorn client, i es va dissenyar per afegir interactivitat a les pàgines HTML.
JavaScript no està restringit per cap llicència comercial.

Evolució històrica de JavaScript

img

Tots els navegadors moderns incorporen algun intèrpret de codi JavaScript:

Navegador Motor de JavaScript
Firefox SpiderMonkey
Chrome V8
Opera Carakan / V8
Safari Nitro
Edge Chakra / V8

Informació addicional

Podeu trobar una llista més completa de motors de JavaScript a la wikipedia.

JavaScript també és pot executar en entorn servidor (Server Side JavaScript, SSJS) per exemple utilitzant node.js

Característiques distintives

  • sintaxi similar a la de C++ i Java
  • basat en objectes, però no orientat a objectes
  • feblement tipat: una variable pot contenir valors de diferents tipus en diferents moments de l'execució
  • herència basada en prototipus enlloc d'en classes
  • qualsevol funció pot actuar com un constructor

Sintaxi

Tot el codi JavaScript va entre les etiquetes <script> i </script>.
Podem posar un bloc <script> a qualsevol punt de la capçalera (<head>) o el cos (<body>) de la pàgina.
Per eficiència en la càrrega de la pàgina, es recomana posar tot el codi JavaScript al final del codi HTML, just abans de la marca </body>

El codi JavaScript es pot integrar amb el codi HTML de 3 maneres diferents i compatibles entre sí:

JavaScript dins del document HTML

En qualsevol punt dins del codi HTML podem utilitzar les etiquetes <script> i </script> per indicar l'existència d'un bloc de codi JavaScript.

<body>
    <h1>Pàgina HTML</h1>
    <script>
        alert("Això és codi JavaScript");
    </script>
</body>

Aquest codi s'executarà mentre la pàgina es carrega.

JavaScript en un fitxer extern

El codi JavaScript es pot guardar en un fitxer extern, normalment amb l'extensió .js
En qualsevol punt dins del codi HTML podem utilitzar les etiquetes

<script src=”script.js”></script>

per carregar el codi, que es comportarà com si estigués escrit en el punt on hem posat l'etiqueta <script>

(dins del fitxer extern no s'hi ha de posar les etiquetes <script>)

JavaScript dins d'elements HTML

Consisteix en inserir fragments de JavaScript dins d'atributs d'etiquetes HTML, normalment associat a esdeveniments.

<div onclick=”alert('Has fet clic');”>Fes clic</div>

Això fa que el codi HTML i JavaScript quedin barrejats, però hi ha tècniques per evitar-ho, com ara associar els esdeveniments directament a objectes del DOM (ho veurem a la UF3)

Majúscules i minúscules

JavaScript distingeix entre majúscules i minúscules a l'hora de referir-se a:

  • paraules reservades del llenguatge
  • noms de variables
  • noms de funcions
alert("Això és codi JavaScript"); // correcte
Alert("Això és codi JavaScript"); // error

Convencions a l'hora de posar noms

Per evitar confusions a l'hora de declarar variables i funcions, existexen algunes convencions que podem utilitzar.
Les més habituals són:

Nom Primera lletra Si hi ha més d'una paraula... Exemple
Camel case minúscula es comença només la primera lletra
de les següents paraules en majúscula
nomUsuari
Snake case minúscula s'escriu tot en minúscula i on hi aniria
un espai s'hi posa un guió baix
nom_usuari
Kebab case minúscula s'escriu tot en minúscula i on hi aniria
un espai s'hi posa un guió,
es fa servir per exemple en CSS
nom-usuari
Pascal case majúscula es comença només la primera lletra
de les següents paraules en majúscula
NomUsuari
Macro case majúscula s'escriu tot en majúscula i on hi aniria
un espai s'hi posa un guió baix,
es sol utilitzar per distingir les constants
NOM_USUARI

En cas de produir-se un error no es mostra cap missatge al cos de la pàgina i cal buscar-lo a la consola del navegador, dins les eines de desenvolupador.
Entre aquestes eines també hi trobarem un depurador (debugger) que ens permetrà posar punts de parada, executar el codi pas per pas o avaluar qualsevol variable o expressió.

Comentaris al codi

Comentar una sola línia, posant-hi al davant //

// alert("Això és codi JavaScript");

Comentar un bloc, tancant-lo entre /* i */

/*
    alert("Això és codi JavaScript");
*/

Punt i coma

Normalment s'acaba cada instrucció de JavaScript amb un punt i coma ;.
El seu ús és opcional excepte quan hi ha més d'una instrucció per línia.

let a = 10
let b = 15  // <-- correcte (sense ;)
let a = 10; let b = 15; // <-- correcte (amb ;)

Variables

Són espais de memòria que s'identifiquen amb un nom i que poden emmagatzemar dades.

Els noms de les variables:

Declaració de variables

Les variables de JavaScript es poden declarar de 4 formes diferents:

Automàticament

Una variable es declara automàticament el primer cop que s'utilitza i es converteix en una variable global, independentment del punt del codi on s'hagi declarat.

a = 3;
b = "Hola";

Atenció!

Es considera una mala pràctica de programació no declarar explícitament les variables abans d'utilitzar-les, per tant s'ha d'evitar aquesta sintaxi encara que JavaScript ho permeti.

Recomanació

Si activem el mode estricte de JavaScript no se'ns permetrà treballar amb variables que no s'hagin inicialitzat, fer-ho provocarà un error.

Utilitzant const

Una variable assignada amb const:

  • té àmbit de bloc
  • no es pot redeclarar
  • no se li pot assignar un nou valor
  • se li ha d'assignar un valor en el mateix moment de declarar-la
const a = 3;
a = 4; // ERROR, no es pot tornar a assignar

const a;  // ERROR, declarada sense un valor
a = 4;

En el cas dels arrays i objectes, no es pot assignar un nou valor a la variable però sí que es pot canviar els elements que contenen l'array o objecte:

const fruites = [ "taronja", "llimona", "plàtan" ];

fruites[0] = "pinya"; // Correcte

fruites = [ "pinya", "coco" ]; // ERROR, no es pot tornar a assignar

Ús recomanat de 'const'

La forma recomanada de declarar els arrays i els objectes en JavaScript és utilitzant const.
Això permet actualitzar els seus elements i alhora impedeix que la variable es reassigni o pugui canviar de tipus per error.

Utilitzant let

Una variable assignada amb let:

  • té àmbit de bloc
  • no es pot redeclarar
  • s'ha de declarar abans de poder utilitzar-la
let a = 3;
let a = 4; // ERROR, no es pot redeclarar

Ús recomanat de 'let'

La forma recomanada de declarar variables numèriques, de cadena o booleanes en JavaScript és utilitzant let.

Com que letàmbit de bloc, si redeclarem la variable dins d'un bloc de codi no afectem la variable que es troba fora del bloc:

let a = "hola";

for (let a = 0; a < 5; a++) { // dins del bloc { } és una altra variable
// a --> 0,1,2,3,4
}

// a --> "hola"

Utilitzant var

Una variable assignada amb var no té àmbit de bloc, sinó de funció o global depenent del lloc on es declara.

Variable local, es redeclara dins d'una funció:

var a = 10; // declarada fora d'una funció, és una variable GLOBAL

function test() {
    var a = 5; // variable LOCAL de la funció
    // a --> 5
}

test();

// a --> 10

Variable global, s'utilitza directament dins d'una funció

var a = 10; // declarada fora d'una funció, és una variable GLOBAL

function test() {
    a = 5; // és la variable GLOBAL, el valor és sobreescriu
    // a --> 5
}

test();

// a --> 5

Si provem el mateix exemple hem fet amb let amb var, el resultat és diferent degut a l'àmbit:

var a = "hola";

for (var a = 0; a < 5; a++) { // <-- és la mateixa variable
// a --> 0,1,2,3,4
}

// a --> 5

Recomanació

En JavaScript modern (ES6) el conveni és no fer servir mai var i de clarar totes les variables només amb const i let:

  • const per els valors que no variaran, arrays i objectes
  • let per tota la resta

La declaració amb var es manté per compatibilitat amb el codi que hagi funcionar amb navegadors antics.

Inicialització de variables

Es pot declarar més d'una sola variable alhora separant-les per coma:

let variable1;
let variable2, variable3;

Podem fer l'assignació del valor just en el moment de la declaració.

let variable1 = 30;
let variable2 = 50, variable3 = 60;

No s'ha d'especificar el tipus de les variables, ja que JavaScript fa assignació dinàmica de tipus quan els assignem un valor.
En el moment de declarar-les el seu valor és indefinit (undefined).

Consell

Es considera una bona pràctica de programació declarar totes les variables a l'inici del bloc de codi.

Donem un valor a una variable amb l'operador d'assignació =

Podem assignar un valor:

  • per assignació directa

    let variable1 = 30;
    

  • per assignació indirecta (per ex. a través d'un càlcul)

    let variable2 = variable1 + 10;
    

  • per sol·licitud a l'usuari

    let variable3 = prompt('Introdueix un valor');
    

Àmbit de les variables

L'àmbit determina l'accessibilitat (visibilitat) de les variables.

JavaScript té 3 tipus d'àmbit:

Recorda

Si declarem una variable sense cap paraula reservada (const, let o var) al davant, la variable tindrà àmbit global en tot cas, encara que la declarem dins d'una funció o d'un bloc.

És una mala pràctica de programació ometre la declaració de les variables.

Àmbit de bloc

Les variables declarades dins d'un bloc { } no són accessibles fora del bloc:

{
    let x = 10;
}

// La variable x no existeix aquí

S'aplica només a les variables declarades amb let i const:

{
    var x = 10;
}

// La variable x es pot utilitzar aquí i té el valor 10

Àmbit de funció

Les variables declarades dins d'una funció no són accesibles fora de la funció.
S'aplica a les variables declarades amb let, const, i var.

function test() {
    let x = 10;
}

// La variable x no existeix aquí

Àmbit global

Les variables declarades fora de qualsevol funció tenen àmbit global, i són accessibles des de qualsevol punt del codi JavaScript.

var x = 10;

function test() {
    x++;
}

test();

// En aquest punt la variable x valdrà 11

Si dins d'una funció es defineix una variable local amb el mateix nom que una variable global existent, dins de la funció la variable local preval per sobre de la global.

var x = 10;

function test() {
    var x = 3;
    x++;
}

test();

// En aquest punt la variable x valdrà 10

Tipus bàsics de dades

Els tipus de dades bàsics de JavaScript són:

Números

Només hi ha un tipus de números.
Es poden escriure amb o sense decimals.

let x = 3;
let y = 2.0;
let z = 3.14159;

Internament tots es guarden en format de coma flotant de 64 bits, equivalent al tipus double

Cadenes

Les cadenes de text es delimiten entre cometes simples ' o dobles ".
En una cadena hi poden aparèixer cometes sempre que no siguin del tipus de les delimitadores.

let s1 = "Ens n'anem";
let s2 = "El seu nom és 'Jordi'";
let s3 = 'El seu nom és "Jordi"';

O bé podem fer servir seqüències d'escapament:

let s4 = "El seu nom és \"Jordi\"";

Longitud màxima d'una cadena

Les cadenes estan limitades per l'especificació del llenguatge a 253 elements, que equival a 16384TB d'espai d'emmagatzematge.
Tot i això, els motors de JavaScript dels navegadors limiten la mida màxima de les cadenes a un valor més tractable:

  • per Chrome: 1GB
  • per Firefox: 2GB
  • per Safari: 4GB

Template literals (Template strings)

Els literals de plantilla (o cadenes de plantilla) són un tipus de cadenes amb característiques addicionals.
Es van incorporar al llenguatge a partir d'ECMAScript versió 6 (ES6).

Es delimiten amb el càracter de l'accent obert `.

let s1 = `Bon dia`;
  • Permeten la interpolació de variables i expressions
    Es substitueixen automàticament pel seu valor en delimitar-les amb ${...}.
let nom = "Jordi";
let s1 = `El seu nom és "${nom}"`; // El seu nom és "Jordi"

let quantitat = 3;
let preu = 200;
let import = `Import: ${quantitat * preu}`; // Import: 600
  • Permeten múltiples línies de text
    No cal posar explícitament un salt de línia amb \n, sinó que podem fer-lo directament dins de la cadena de text.
let cadena = `primera línia
segona línia
tercera línia`;

Booleans

Només poden tenir dos valors

  • cert (true)
  • fals (false)

Arrays

Els veurem amb detall més endavant.

Objectes

Els veurem amb detall més endavant.

Operadors

Condicionals

Iteracions

Mode estricte

El mode estricte provoca que es generin errors quan s'executa codi que considera una mala pràctica de programació i que altrament funcionaria sense donar cap error, possiblement ocasionant problemes difícils de detectar.

Aquesta directiva es va afegir al llenguatge partir de la versió 5 d'ECMAScript (2009).

El mode estricte de JavaScript es declara afegint la cadena "use strict"; a l'inici d'un bloc de codi o d'una funció.

"use strict";

a = 5; // Provocarà un error

Per exemple, si en JavaScript escrivim malament el nom d'una variable no es genera cap error, i es crea una nova variable global.
En mode estricte això provocaria un error, en detectar que la variable no havia sigut declarada prèviament:

{
    let variable = 5
    varible = 4 // ERROR NO DETECTAT --> es crea una nova variable global
}

{
    "use strict";
    let variable = 5
    varible = 4 // Uncaught ReferenceError: varible is not defined
}

Algunes funcions del mode estricte:

  • no permet utilitzar variables que no s'hagin declarat prèviament
  • no permet utilitzar objectes que no s'hagin declarat prèviament
  • no permet esborrar variables, objectes ni funcions amb delete
  • restringeix l'ús de la funció eval()
  • canvia el comportament de la paraula reservada this

Strict mode (MDN)

Exemples

Suma de 2 números

Canvi de propietats d'elements HTML

Generació de contingut HTML

Calculadora

Captcha simple

Captcha alfabètic