SlideShare une entreprise Scribd logo
1  sur  128
Télécharger pour lire hors ligne
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
programare Web: JS modern (ES6 et al.)
www.flickr.com/photos/nathansmith/4704268314/
Full-Stack Web Development
Dr. Sabin Corneliu Buraga – profs.info.uaic.ro/~busaco/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
“A programming language is low level when
its programs require attention to the irrelevant.”
Alan J. Perlis
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Care este prezentul și viitorul
limbajului JavaScript?
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2015 (ES6)
definirea de clase – perspectiva paradigmei obiectuale
parametri cu valori implicite și parametri multipli
machete pentru șiruri de caractere (template literals)
declararea succintă a funcțiilor anonime (arrow functions)
iteratori și generatori
notificări privind rezultatul oferit de o funcție (promises)
noi tipuri de date – e.g., Set, Map, Symbol, Proxy
modularizarea codului: module + importuri
…
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
lista facilităților + exemplificări:
es6-features.org
ponyfoo.com/articles/es6
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Definirea de clase
(perspectiva paradigmei obiectuale)
“simple sugar over the prototype-based OO pattern”
ponyfoo.com/articles/es6-classes-in-depth
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
const DIST = 7, MAXPOWER = 33;
class Robot {
constructor (distance = 0) {
this.power = 0;
this.distance = distance;
}
move () {
if (this.power < 1) {
throw new RangeError ('N-am energie');
}
this.power--;
this.distance += DIST;
}
addPower () {
if (this.power >= MAXPOWER) {
throw new RangeError ('Bateria e plină');
}
this.power++;
}
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
const DIST = 7, MAXPOWER = 33;
class Robot {
constructor (distance = 0) {
this.power = 0;
this.distance = distance;
}
move () {
if (this.power < 1) {
throw new RangeError ('N-am energie');
}
this.power--;
this.distance += DIST;
}
addPower () {
if (this.power >= MAXPOWER) {
throw new RangeError ('Bateria e plină');
}
this.power++;
}
}
un robot poate fi mutat,
parcurgând o distanță
prestabilită și consumând
o unitate energică
suplimentar, poate fi
alimentat cu energie
în ES6 se pot declara
parametri cu valori implicite
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
const DIST = 7, MAXPOWER = 33;
class Robot {
constructor (distance = 0) {
this.power = 0;
this.distance = distance;
}
move () {
if (this.power < 1) {
throw new RangeError ('N-am energie');
}
this.power--;
this.distance += DIST;
}
addPower () {
if (this.power >= MAXPOWER) {
throw new RangeError ('Bateria e plină');
}
this.power++;
}
}
// instanțiem un robot
// distanța ia valoarea implicită
let robot = new Robot ();
console.log (robot.distance);
try {
robot.addPower ();
robot.move ();
robot.move ();
} catch (e) {
console.error (e.message);
} finally {
console.log ('M-am deplasat cu '
+ robot.distance +
' metri, iar energia actuală este '
+ robot.power);
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
const DIST = 7, MAXPOWER = 33;
class Robot {
constructor (distance = 0) {
this.power = 0;
this.distance = distance;
}
move () {
if (this.power < 1) {
throw new RangeError ('N-am energie');
}
this.power--;
this.distance += DIST;
}
addPower () {
if (this.power >= MAXPOWER) {
throw new RangeError ('Bateria e plină');
}
this.power++;
}
}
// instanțiem un robot
// distanța ia valoarea implicită
let robot = new Robot ();
console.log (robot.distance);
try {
robot.addPower ();
robot.move ();
robot.move ();
} catch (e) {
console.error (e.message);
} finally {
console.log ('M-am deplasat cu '
+ robot.distance +
' metri, iar energia actuală este '
+ robot.power);
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
class R2D2 extends Robot {
constructor (distance) {
super (distance * 2);
}
move () {
super.move ();
this.power++; // R2D2 nu consumă energie ;)
}
}
mai sunt permise:
extinderi de clasă via extends
acces – cu super – la membrii din clasa de bază
metode de tip get și set
metode statice specificate cu prefixul static (similar C++)
a se vedea arhiva
exemplelor
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// instanțiem robotul din clasa R2D2
let r2d2 = new R2D2 (15);
try {
r2d2.addPower (); // inițial, R2D2 trebuie alimentat cu energie
r2d2.move ();
} catch (e) {
console.error (e.message);
}
finally {
console.log ('Sunt R2D2, m-am deplasat cu '
+ r2d2.distance + ' metri, iar energia curentă este ' + r2d2.power);
}
de ce această
valoare?
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi maniere de a declara variabile
const – valori constante vizibile la nivel de bloc
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi maniere de a declara variabile
let – alternativă la var, cu vizibilitate la nivel de bloc
(mărginirea domeniului de vizibilitate – scope)
ponyfoo.com/articles/es6-let-const-and-temporal-dead-zone-in-depth
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
function TestareLet () {
let x = 33;
if (true) {
// variabilă diferită!
let x = 74;
console.log (x); // 74
}
console.log (x); // 33
}
function TestareVar () {
var x = 33;
if (true) {
// aceeași variabilă
var x = 74;
console.log (x); // 74
}
console.log (x); // 74
}
developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
verificarea suportului oferit
de navigatoarele Web:
instrumentul Can I Use
caniuse.com
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Parametrii unei funcții pot fi multipli
(spread/rest parameters)
const DELIM = 'u2605u2A3C'; // caractere Unicode
function concatenează (...cuvinte) {
return cuvinte.join (DELIM);
}
console.log (concatenează ('ES6', 'e', 'super!')); // "ES6★⨼e★⨼super!"
ponyfoo.com/articles/es6-spread-and-butter-in-depth
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Destructurare în ES6 (destructuring)
“binds properties to as many variables as you need
and it works with both arrays and objects”
ponyfoo.com/articles/es6-destructuring-in-depth
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
destructurare pentru date de tip Array
// selectarea elementelor dorite dintr-o listă (tablou)
let [ primul, , ultimul ] = [ 'Ana', 'Bogdan', Date.now() ];
console.log (primul); // "Ana"
console.log (ultimul); // data curentă în secunde
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
destructurare pentru date de tip Array
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
destructurare în cazul obiectelor
// oferă – ca obiect – coordonatele geografice pentru Iași
function furnizeazăCoordonate () {
return { lat: 47.16667, long: 27.6 };
}
var { lat, long } = furnizeazăCoordonate ();
console.log (long);
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
destructurare în cazul obiectelor
(aici, parametri ai funcțiilor)
// furnizează un număr natural generat aleatoriu dintr-un anumit interval
function genAleator ({ min = 1, max = 300 } = { }) {
return Math.floor (Math.random () * (max - min)) + min;
}
for (let it of [1, 2, 3, 4]) { // 4 numere generate aleatoriu
console.log (genAleator ());
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
destructurare în cazul obiectelor
(aici, parametri ai funcțiilor)
// furnizează un număr natural generat aleatoriu dintr-un anumit interval
function genAleator ({ min = 1, max = 300 } = { }) {
return Math.floor (Math.random () * (max - min)) + min;
}
for (let it of [1, 2, 3, 4]) { // 4 numere generate aleatoriu
console.log (genAleator ());
}
rularea programului cu instrumentul interactiv JS Bin
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Machete privind substituția de valorile de bază
(template literals)
machetă = orice șir de caractere delimitat de simbolul `
(inclusiv specificat pe mai multe linii de text – multiline)
o machetă poate include expresii JavaScript specificate
cu ${…} ce vor fi înlocuite cu valoarea evaluată
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
var articol = { // obiect JS oferind date despre un articol
titlu: 'Machete ES6',
subiect: 'facilități privind substituția de valori',
slogan: 'Generare HTML cu JS',
termeni: [ 'ES6', 'JavaScript', 'HTML5' ]
};
var { titlu, subiect, slogan, termeni } = articol; // destructurare
var html = `<article>
<header><h1>${titlu}</h1></header>
<section>
<h2>Articol despre ${subiect}</h2>
<p>${slogan}</p>
</section>
<footer class='subsol'>
<ul>${termeni.map (termen => `<li>${termen}</li>`).join ('nttt')}</ul>
</footer>
</article>`;
console.log (html);
fiecărui element din tabloul termeni îi corespunde
o machetă a cărei valoare va fi un marcaj HTML
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
alte detalii sunt furnizate de
ponyfoo.com/articles/es6-template-strings-in-depth
es6-features.org/#StringInterpolation
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Arrow functions
declarare succintă a unei funcții anonime
parametri => valoareOferită
nu posedă propriile valori pentru this, arguments, super
ponyfoo.com/articles/es6-arrow-functions-in-depth
developer.mozilla.org/Web/JavaScript/Reference/Functions/Arrow_functions
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// funcție anonimă cu un singur argument de intrare
// se întoarce valoarea unei expresii JS
console.log ( [2, 3, 5].map (număr => număr * 7) ); // [14, 21, 35]
// în JavaScript clasic (ES5):
console.log ( [2, 3, 5].map (function (număr) {
return număr * 7;
}) );
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// definirea unei funcții recursive în ES6 – aici, factorialul
let factorial = (număr) => {
return număr === 0 ? 1 : număr * factorial (număr - 1);
};
console.log ( factorial (5) ); // 120
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
let numere = [1, 7, 50, 74, 9, 85, 51, 12, 7, 15];
// asocieri între valori și funcții
// aici, calculul pătratului fiecărei valori a elementelor din tablou
let pătrate = numere.map (val => Math.pow (val, 2));
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
let numere = [1, 7, 50, 74, 9, 85, 51, 12, 7, 15];
// reducerea unui tip de date structurat la o valoare scalară
// aici, suma tuturor valorilor: 311
let suma = numere.reduce ((a, b) => a + b);
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
let numere = [1, 7, 50, 74, 9, 85, 51, 12, 7, 15];
// filtrarea valorilor, obținând un sub-tablou
// aici, doar numerele impare: [1, 7, 9, 85, 51, 7, 15]
let impare = numere.filter (val => val % 2 === 1);
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
var numere = [1, 7, 50, 74, 9, 85, 51, 12, 7, 15];
const MAX = 99;
/* întoarce true dacă predicatul func are ca rezultat true
pentru orice element al colecției de date
– cuantificatorul universal oricare (all – ∀) */
const toate = (tablou, func = Boolean) => tablou.every (func);
// ce rezultă executând liniile de cod următoare?
toate (numere, număr => număr >= 18 && număr < 65);
toate (numere, număr => Math.sqrt (număr) <= MAX);
adaptare după github.com/30-seconds/30-seconds-of-code
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
var numere = [1, 7, 50, 74, 9, 85, 51, 12, 7, 15];
/* întoarce true dacă predicatul func are ca rezultat true
pentru măcar un element al colecției de date
– cuantificatorul existențial  */
const există = (tablou, func = Boolean) => tablou.some (func);
Cum se specifică în ES6 expresia care verifică dacă există
măcar o vârstă de adult printre valorile tabloului numere?
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// convertirea unui număr într-un tablou de cifre
const digitizare = număr => [...`${număr}`].map (i => parseInt(i));
console.log ( digitizare (Math.LOG10E) );
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// convertirea unui număr într-un tablou de cifre
const digitizare = număr => [...`${număr}`].map (i => parseInt(i));
console.log ( digitizare (Math.LOG10E) );
???
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// trunchierea unui șir de caractere
const MIN = 3;
const truncȘir = (șir, număr) =>
// dacă lungimea șirului e mai mare decât
// numărul de caractere dorit
șir.length > număr ?
// înlocuim caracterele în surplus cu șirul '...'
șir.slice (0, număr > MIN ? număr - MIN : număr) + '...' : șir;
adaptare după github.com/30-seconds/30-seconds-of-code
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Iteratori
iterarea valorilor se poate realiza asupra oricărui obiect
generarea de secvențe de valori (finite ori infinite)
ce pot fi procesate via construcția for…of
ponyfoo.com/articles/es6-iterators-in-depth
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// Recurgerea la iteratori pentru a genera secvențe infinite de valori
const VAL = 7, MAX = 69;
let secvMult = { // generează o secvență de nr. multiplicate cu o valoare
[Symbol.iterator]() {
let curent = 0; // contor disponibil doar în interiorul iteratorului
return {
next () { // se expune metoda next () pentru a obține următoarea valoare
curent++;
// metoda next () va întoarce obligatoriu 2 valori
return {
done: false, // 'true' semnalează că secvența se termină
value: curent * VAL // desemnează elementul curent al secvenței
};
}
};
}
}
for (let numar of secvMult) {
if (numar > MAX) break; // secvența fiind infinită, trebuie să folosim 'break'
console.log (numar);
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
rezultat al execuției programului JavaScript
de experimentat rularea cu JS Bin
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Iteratori
remarcă:
un singur element al secvenței poate fi accesat
la un moment dat (lasy in nature)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Generatori
generator = tip special de iterator ce returnează g
obiecte de tip generator care ulterior pot fi iterate cu
Array.from (g) sau […g] sau for valoare of g
ponyfoo.com/articles/es6-generators-in-depth
es6-features.org/#GeneratorFunctionIteratorProtocol
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Generatori
oprirea temporară și apoi continuarea execuției
unui generator se realizează via yield
developer.mozilla.org/Web/JavaScript/Reference/Operators/yield
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// declararea unui generator de identificatori numerici
function* idMaker () {
var index = 0;
while (index < 3)
yield index++;
}
const gen = idMaker ();
// obținerea unui identificator via generatorul declarat
console.log (gen.next ().value); // 0
console.log (gen.next ().value); // 1
console.log (gen.next ().value); // 2
console.log (gen.next ().value); // undefined
// iterarea valorilor de identificatori generați
for (let id of idMaker ()) {
console.log (id);
}
vezi exemplul
din arhivă
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// declararea unui generator de identificatori numerici
function* idMaker () {
var index = 0;
while (index < 3)
yield index++;
}
const gen = idMaker ();
// obținerea unui identificator via generatorul declarat
console.log (gen.next ().value); // 0
console.log (gen.next ().value); // 1
console.log (gen.next ().value); // 2
console.log (gen.next ().value); // undefined
// iterarea valorilor de identificatori generați
for (let id of idMaker ()) {
console.log (id);
}
function* declară un generator
apelul idMaker () nu execută corpul
funcției, ci creează un obiect generator
menit a controla execuția
instrucțiunilor din corp
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// generarea secvenței numerelor lui Fibonacci
let fib = function* (numere) {
let prec = 0, curent = 1;
while (numere-- > 0) {
[ prec, curent ] = [ curent, prec + curent ]; // destructurare
yield curent;
}
}
// primele 10 numere
console.log ([ ...fib (10) ]); // [1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
// al doilea din secvență, apoi restul de la al patrulea încolo
let [ , n2, , ...restul ] = fib (10);
console.log (n2, restul); // 2 și [5, 8, 13, 21, 34, 55, 89]
adaptare după es6-features.org/#GeneratorMatching
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// generarea secvenței numerelor lui Fibonacci
let fib = function* (numere) {
let prec = 0, curent = 1;
while (numere-- > 0) {
[ prec, curent ] = [ curent, prec + curent ]; // destructurare
yield curent;
}
}
// primele 10 numere
console.log ([ ...fib (10) ]); // [1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
// al doilea din secvență, apoi restul de la al patrulea încolo
let [ , n2, , ...restul ] = fib (10);
console.log (n2, restul); // 2 și [5, 8, 13, 21, 34, 55, 89]
rezultatul programului
executat de Node.js
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
pentru aspecte avansate, a se studia:
exploringjs.com/es6/ch_generators.html
www.promisejs.org/generators/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Promises
promisiune (promise)  rezultat ce ar putea fi oferit
în urma execuției unei operații asincrone
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Promises
promisiune (promise)  rezultat ce ar putea fi oferit
în urma execuției unei operații asincrone
represents an operation that has not completed yet,
but is expected in the future
developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/Promise
exploringjs.com/es6/ch_promises.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Promises
fiecare obiect de tip Promise
se poate afla în una dintre stările:
pending – stare inițială,
operația nu s-a terminat sau a fost anulată
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Promises
fiecare obiect de tip Promise
se poate afla în una dintre stările:
fulfilled – operația s-a terminat cu succes,
oferind un rezultat
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Promises
fiecare obiect de tip Promise
se poate afla în una dintre stările:
rejected – operația a eșuat,
oferindu-se un motiv (eroarea survenită)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Promises
fiecare obiect de tip Promise
se poate afla în una dintre stările:
settled – operația a avut loc (cu succes sau cu eroare)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// implementarea unui obiect Promise
var promise = new Promise (function (resolve, reject) {
// realizarea unor operații (eventual, în mod asincron)
// apoi, în funcție de ceea ce s-a întâmplat…
if (/* totul e în regulă */) {
resolve ("A mers!"); // poate fi prelucrat rezultatul cu then ()
}
else {
reject (Error ("S-a stricat")); // eroarea poate fi tratată via catch ()
}
});
specificația pentru implementarea standardizată:
promisesaplus.com
biblioteci JS: promisesaplus.com/implementations
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// implementarea unui obiect Promise
var promise = new Promise (function (resolve, reject) {
// realizarea unor operații (eventual, în mod asincron)
// apoi, în funcție de ceea ce s-a întâmplat…
if (/* totul e în regulă */) {
resolve ("A mers!"); // poate fi prelucrat rezultatul cu then ()
}
else {
reject (Error ("S-a stricat")); // eroarea poate fi tratată via catch ()
}
});
// utilizarea ulterioară
promise.then (function(result) {
console.log (result); // "A mers!"
}, function(err) {
console.log (err); // Error: "S-a stricat"
});
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
metodele then () și catch () pot fi înlănțuite
.then (onFullfilment)
.then ()
.catch ()
pending pending
settled
acțiuni asincrone
(async actions)
.then (onRejection)
.catch (onRejection)
tratarea erorilor
(error handling)
…Promise Promise
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
metodele then () și catch () pot fi înlănțuite
un tutorial, oferind exemple practice:
developers.google.com/web/fundamentals/primers/promises
a se studia și github.com/wbinnssmith/awesome-promises
.then (onFullfilment)
.then ()
.catch ()
pending pending
settled
acțiuni asincrone
(async actions)
.then (onRejection)
.catch (onRejection)
tratarea erorilor
(error handling)
…Promise Promise
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi tipuri de date ES6
Set
Map
WeakSet
WeakMap
Symbol
Proxy
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi tipuri de date ES6: Set
structură de date iterabilă implementând
conceptul de mulțime (un element apare o singură dată)
proprietate: size – nu se utilizează length
metode: add() delete() clear() entries()
has() forEach() keys() values()
developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/Set
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi tipuri de date ES6: Map
structură de date iterabilă de tip asociere cheie—valoare
(cheile și valorile pot avea orice tip, inclusiv funcții)
proprietate: size
metode: set() get() delete() clear() entries()
has() forEach() keys() values()
developer.mozilla.org/Web/JavaScript/Reference/Global_Objects/Map
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi tipuri de date ES6: Map
desemnează o colecție
vizând manipularea tablourilor asociative
ordinea cheilor contează (e păstrată),
spre deosebire de Object
de studiat Maya Shavin, ES6: Map vs Object, What and When? (2018)
medium.com/front-end-weekly/es6-map-vs-object-what-and-when-b80621932373
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// instanțiem un obiect Map pentru a stoca atribute
// despre profilul unui utilizator în forma cheie-valoare
let profil = new Map();
// stabilim chei (aici, pasiune și mediu)
profil.set ('pasiune', { tip: 'muzica', gen: 'rock', stil: 'progresiv',
grupFavorit: [ 'Pink Floyd', 'Yes' ] }); // un obiect
profil.set ('mediu', 'urban');
if (profil.has ('mediu')) { // verificăm existența unei chei
profil.set ('mediu', 'cosmic');
}
// redăm la consolă valorile cheilor
console.log (profil.get ('pasiune'));
console.log (profil.get ('pasiune').grupFavorit[0]);
// iterarea cheilor & valorilor aferente
profil.forEach((val, cheie) => console.log(`cheie: ${cheie}, valoare: ${val}`));
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi tipuri de date ES6: WeakSet
similar cu Set, dar reprezintă o mulțime de obiecte și
nu de valori arbitrare având diverse tipuri de date
în contrast cu Set, obiectele de tip WeakSet nu pot fi
enumerate, iar referințele la obiecte sunt weak
– dacă nu există referințe la una dintre cheile sale,
obiectul este eliberat din memorie (garbage collection)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi tipuri de date ES6: WeakMap
similar cu WeakSet, dar fiecare cheie trebuie să fie obiect
ponyfoo.com/articles/es6-weakmaps-sets-and-weaksets-in-depth
www.sitepoint.com/using-the-new-es6-collections-map-set-weakmap-weakset/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi tipuri de date ES6: Symbol
un simbol este un tip de date imutabil ce poate fi folosit
ca identificator unic pentru proprietățile obiectelor
a symbol never clashes with any other property key
(symbol or string)
exploringjs.com/es6/ch_symbols.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
const ST_VESEL = Symbol('😀');
const ST_TRIST = Symbol('😞');
const ST_NEUTRU = Symbol('😐');
function oferăStareComplementară (stare) {
switch (stare) {
case ST_VESEL: return ST_TRIST;
case ST_TRIST: return ST_VESEL;
default: throw new Error ('Stare de spirit necunoscută');
}
}
try {
console.log (oferăStareComplementară (ST_TRIST));
// conversia la șir de caractere trebuie realizată explicit
console.log (oferăStareComplementară (ST_VESEL).toString ());
// apelăm funcția având ca argument un simbol nedorit
console.log (oferăStareComplementară (ST_NEUTRU));
} catch (e) {
console.log (e.message);
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
const ST_VESEL = Symbol('😀');
const ST_TRIST = Symbol('😞');
const ST_NEUTRU = Symbol('😐');
function oferăStareComplementară (stare) {
switch (stare) {
case ST_VESEL: return ST_TRIST;
case ST_TRIST: return ST_VESEL;
default: throw new Error ('Stare de spirit necunoscută');
}
}
try {
console.log (oferăStareComplementară (ST_TRIST));
// conversia la șir de caractere trebuie realizată explicit
console.log (oferăStareComplementară (ST_VESEL).toString ());
// apelăm funcția având ca argument un simbol nedorit
console.log (oferăStareComplementară (ST_NEUTRU));
} catch (e) {
console.log (e.message);
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Noi tipuri de date ES6: Proxy
se permite interceptarea și modificarea operațiilor
realizate de obiecte – e.g., proprietăți de tip getter
redefinirea semanticii unor construcții ale limbajului
de programare (intercession) – aspect al meta-programării
exploringjs.com/es6/ch_proxies.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
(în loc de) pauză
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Extinderea unor tipuri existente
Number – exprimarea de valori octale și binare
const N404octal = 0o624;
const N404binar = 0b110010100;
console.log (N404octal == N404binar); // true
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Extinderea unor tipuri existente
RegExp – noi operatori + opțiuni
exploringjs.com/es6/ch_regexp.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Extinderea unor tipuri existente
String – suport mai bun pentru Unicode
inclusiv vizând internaționalizarea
exploringjs.com/es6/ch_unicode.html
es6-features.org/#UnicodeStringRegExpLiteral
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Tablouri respectând un anumit tip de date
typed arrays
utile pentru a manipula în principal date binare:
întregi (cu/fără semn) cu stocare pe 8, 16, 32 de biți
Int8Array Uint8Array Int16Array Int32Array etc.
numere reale reprezentate pe 32 sau 64 de biți
Float32Array Float64Array
exploringjs.com/es6/ch_typed-arrays.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// definim o structură de date pe 24 de octeți, similară celei din limbajul C:
// struct Animal { unsigned long id; char nume[16]; float mărime }
class Animal {
constructor (mem = new ArrayBuffer (24)) { // alocăm memoria necesară
this.mem = mem;
};
// gestionarea memoriei corespunzătoare datelor de stocat (un buffer)
set mem (date) { // stocarea datelor în zona de memorie alocată
this._mem = date; // intern, vor fi folosite proprietăți „private”
this._id = new Uint32Array (this._mem, 0, 1);
this._nume = new Uint8Array (this._mem, 4, 16);
this._mărime = new Float32Array (this._mem, 20, 1);
}
get mem () { // obținerea datelor stocate
return this._mem;
}
adaptare după es6-features.org/#TypedArrays
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// metode setter/getter pentru fiecare membru în parte
set id (v) { this._id[0] = v; }
get id () { return this._id[0]; }
set nume (v) { this._nume = v; }
get nume () { return this._nume; }
set mărime (v) { this._mărime[0] = v; }
get mărime () { return this._mărime[0]; }
}
let tux = new Animal ();
tux.id = 69;
tux.nume = "Tux";
tux.mărime = 15.74;
console.log (`Obiectul ${tux.nume} are identificatorul ${tux.id}
și mărimea ${tux.marime}.`);
adaptare după es6-features.org/#TypedArrays
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Module
scop: modularizarea + reutilizarea codului-sursă
spre deosebire de JavaScript clasic, unde modularizarea
se baza pe biblioteci externe (CommonJS sau RequireJS
care adoptă AMD – Asynchronous Module Definition),
în ES6 există suport nativ
exploringjs.com/es6/ch_modules.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// --json.js--
function preiaJSON (url, procDate) { // preia de la un URL date JSON
let xhr = new XMLHttpRequest (); // procesate cu funcția procDate
xhr.onload = function () {
procDate (this.responseText)
};
xhr.open ("GET", url, true);
xhr.send ();
}
export function oferăConținut (url, procDate) {
preiaJSON (url, date => procDate (JSON.parse (date)));
}
specificarea unui modul – stocat într-un fișier conform
politicii „one module per file & one file per module” –
ce oferă (exportă) funcționalități
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// --json.js--
function preiaJSON (url, procDate) {
let xhr = new XMLHttpRequest ();
xhr.onload = function () {
procDate (this.responseText)
};
xhr.open ("GET", url, true);
xhr.send ();
}
export function oferăConținut (url, procDate) {
preiaJSON (url, date => procDate (JSON.parse (date)));
}
// --main.js-- (utilizarea modulului)
import { oferăConținut } from "json.js";
oferăConținut ("http://undeva.info",
date => { procesează (date); });
aici, importul este identificat prin nume (named import)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Remarci:
importul modulelor se poate realiza oriunde în program
(imports are hoisted)
structura modulelor e statică – nu se pot realiza
importuri/exporturi condiționale
se oferă suport pentru dependențe ciclice
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Browser-ele Web moderne oferă suport complet
pentru încărcarea (a)sincronă a modulelor JS:
<script type="module" src="modul.mjs" async></script>
<script nomodule src="fallback.js"></script>
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Browser-ele Web moderne oferă suport complet
pentru încărcarea (a)sincronă a modulelor JS:
<script type="module" src="modul.mjs" async></script>
<script nomodule src="fallback.js"></script>
facilitate descrisă în HTML Living Standard
(15 octombrie 2019)
html.spec.whatwg.org/multipage/scripting.html
tutorial: v8.dev/features/modules
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
suport pentru încărcarea modulelor JS cu
<script type="module">…</script>
tutorial: developers.google.com/web/fundamentals/primers/modules
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Pentru Node.js 12, există doar suport experimental
de parcurs
nodejs.org/api/esm.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Instrumente ES6
în principal, convertire ES6ES5
Babel – babeljs.io
Traceur – github.com/google/traceur-compiler
altele la github.com/addyosmani/es6-tools
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2016 (ES7)
specificație standardizată – ediția 7 (2016)
www.ecma-international.org/ecma-262/7.0/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2016 (ES7)
noutate:
operatorul ** (exponent)
let valoareLaCub = val => val ** 3; // Math.pow (val, 3);
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// prelucrări statistice
var numere = [1, 7, 50, 74, 9, 85, 51, 12, 7, 15];
// funcție ce calculează deviația standard
const devStd = (valori, pop = false) => {
const media = valori.reduce ((tablou, val) => tablou + val, 0) / valori.length;
return Math.sqrt (
valori.reduce ((acurat, val)
=> acurat.concat ((val - media) ** 2), []).reduce ((acurat, val)
=> acurat + val, 0) / (valori.length - (pop ? 0 : 1))
);
};
// afișarea deviației standard
console.log (devStd (numere) ); // eșantion (sample)
console.log (devStd (numere, true) ); // populație (population)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
pentru amănunte, a se studia 30 Seconds of Code
github.com/30-seconds/30-seconds-of-code
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2016 (ES7)
noutate:
verificarea faptului că un element aparține unui tablou
metoda Array.includes ()
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2017 (ES8)
specificație standardizată – ediția 8 (iunie 2017)
www.ecma-international.org/ecma-262/8.0/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2017 (ES8)
noutate:
funcții asincrone (async functions)
definirea unei funcții asincrone conduce la obținerea
unui obiect de tip AsyncFunction
developer.mozilla.org/Web/JavaScript/Reference/Statements/async_function
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Funcții asincrone (async functions)
la apelare, o funcție asincronă oferă un obiect
de tip Promise – acesta e creat la execuția funcției asincrone
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Funcții asincrone (async functions)
la apelare, o funcție asincronă oferă un obiect
de tip Promise – acesta e creat la execuția funcției asincrone
este executat corpul funcției – execuția poate fi terminată
permanent via return (succes) ori throw (caz de eroare)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Funcții asincrone (async functions)
la apelare, o funcție asincronă oferă un obiect
de tip Promise – acesta e creat la execuția funcției asincrone
este executat corpul funcției – execuția poate fi terminată
permanent via return (succes) ori throw (caz de eroare)
sau poate fi temporar oprită via await
(uzual, execuția va fi reluată ulterior)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Funcții asincrone (async functions)
programul poate fi notificat atunci când este disponibil
rezultatul unei funcții – obiectul Promise e în starea settled
adică operația a avut loc (cu succes sau cu eroare):
se recurge la metodele then () și, eventual, catch ()
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Funcții asincrone (async functions)
programul poate fi notificat atunci când este disponibil
rezultatul unei funcții – obiectul Promise e în starea settled
adică operația a avut loc (cu succes sau cu eroare):
se recurge la metodele then () și, eventual, catch ()
această notificare are loc în mod asincron
exploringjs.com/es2016-es2017/ch_async-functions.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
const MAXITER = 7;
async function funcAsinc1 () {
for (let i = 1; i <= MAXITER; i++) {
console.log (`Asincron 1: ${i}`);
};
return "Java";
}
async function funcAsinc2 () {
for (let i = 1; i <= MAXITER; i++) {
console.log (`Asincron 2: ${i}`);
};
return "Script";
}
// deoarece o funcție asincronă întoarce un obiect Promise,
// putem folosi metoda then ();
// pentru a trata erorile se va recurge la catch ()
funcAsincP().then (r => console.log (`Rezultat: ${r}`));
console.log ("Program principal");
async function funcAsincP () {
// se așteaptă execuția ambelor funcții asincrone
const [rez1, rez2] = await Promise.all ([
funcAsinc1 (),
funcAsinc2 (),
]);
return rez1 + rez2;
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
const MAXITER = 7;
async function funcAsinc1 () {
for (let i = 1; i <= MAXITER; i++) {
console.log (`Asincron 1: ${i}`);
};
return "Java";
}
async function funcAsinc2 () {
for (let i = 1; i <= MAXITER; i++) {
console.log (`Asincron 2: ${i}`);
};
return "Script";
}
// deoarece o funcție asincronă întoarce un obiect Promise,
// putem folosi metoda then ();
// pentru a trata erorile se va recurge la catch ()
funcAsincP().then (r => console.log (`Rezultat: ${r}`));
console.log ("Program principal");
async function funcAsincP () {
// se așteaptă execuția ambelor funcții asincrone
const [rez1, rez2] = await Promise.all ([
funcAsinc1 (),
funcAsinc2 (),
]);
return rez1 + rez2;
}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
de aprofundat articolul N. Grozev, Await and Async Explained with
Diagrams & Examples (2017): nikgrozev.com/2017/10/01/async-await/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2017 (ES8)
noutate:
memorie partajată (shared memory)
via obiectul SharedArrayBuffer
+ operații atomice
oferite de obiectul global Atomics
pentru detalii și exemplificări, a se parcurge
exploringjs.com/es2016-es2017/ch_shared-array-buffer.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2018 (ES9)
specificație standardizată – ediția 9 (2018)
www.ecma-international.org/ecma-262/9.0/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2018 (ES9)
noutate:
extinderea suportului pentru expresii regulate
detalii în Axel Rauschmayer, Exploring ES2018 and ES2019
exploringjs.com/es2018-es2019/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2018 (ES9)
noutate:
operatorul … poate fi folosit și pentru proprietăți
ale obiectelor (object spread/rest properties)
exploringjs.com/es2018-es2019/ch_rest-spread-properties.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// preluarea proprietăților enumerabile dintr-un obiect
let { nume, mărime, ...altele } =
{ nume: 'Tux', mărime: 2, oferta: true, disponibil: false };
console.log (altele);
console.log (`Jucăria se numește ${nume};
oferta: ${altele.oferta}`);
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2018 (ES9)
noutate:
operatorul … poate fi folosit și pentru proprietăți ale
obiectelor (object spread/rest properties)
utilizări: „clonarea” și fuziunea obiectelor
const clona = { ...obiect };
const fuziune = { ...obiect1, ...obiect2 };
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2018 (ES9)
noutate:
iterații asincrone (interfețele AsyncIterable și AsyncIterator),
generatori asincroni + construcția for-await-of
explicații și exemplificări:
exploringjs.com/es2018-es2019/ch_asynchronous-iteration.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2018 (ES9)
noutate:
metoda finally() pentru un obiect Promise
se poate defini o funcție de tip callback al cărei cod va fi
întotdeauna executat la terminarea unei promisiuni
exploringjs.com/es2018-es2019/ch_promise-prototype-finally.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2018 (ES9)
noutate:
metoda finally() pentru un obiect Promise
promise
.then (rezultat => {···})
.catch (eroare => {···})
.finally (() => {···});
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2019 (ES10)
specificație standardizată – ediția 10 (iunie 2019)
www.ecma-international.org/ecma-262/10.0/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2019 (ES10)
noutate:
metodele flat() și flatMap() pentru obiecte de tip Array
exploringjs.com/es2018-es2019/ch_array-prototype-flat-flatmap.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2019 (ES10)
noutate:
metoda flat() „aplatizează” (flattens) un tablou ce posedă
elemente imbricate, creând o copie a tabloului unde toate
elementele apar pe un singur nivel
flatMap() realizează în prealabil și o asociere (mapping)
tablou.flatMap(funcție)  tablou.map(funcție).flat(1)
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
// un tablou de tablouri cu nume de membri de echipe
let echipe = [ [ 'Tux', 'Pox' ], // echipa #1
[ 'Puq', [ 'Hax', 'Roa' ] ], // echipa #2
[ 'Tux', 'Roa', 'Muz' ], // echipa #3
'Foh' ]; // și un solitar
console.log (echipe);
console.log (echipe.flat ()); // aplatizăm tabloul
console.log (echipe.flat (2)); // aplatizăm în profunzime
// realizăm și o asociere cu flatMap()
console.log (echipe.flatMap (membru => ('/teams/' + membru) ));
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2019 (ES10)
noutate:
metoda Object.fromEntries() pentru a transforma
o listă de perechi cheie—valoare într-un obiect
operație inversă metodei Object.entries()
exploringjs.com/es2018-es2019/ch_object-fromentries.html
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2019 (ES10)
noutate:
construcția catch nu necesită parametru obligatoriu
(se ignoră complet eroarea)
try {…} catch {…}
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2019 (ES10)
noutate:
tipul String oferă noile metode
trimStart()
trimEnd()
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
ECMAScript 2020
specificație în lucru (12 octombrie 2019)
tc39.github.io/ecma262/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
Alte resurse – disponibile liber:
Nicholas C. Zakas, Understanding ECMAScript 6 (2015)
leanpub.com/understandinges6/read
Ryan Christiani, Let’s Learn ES6 (2018)
bubblin.io/book/let-s-learn-es6-by-ryan-christiani/
Axel Rauschmayer, Exploring JS:
JavaScript books for programmers (2019)
exploringjs.com
Wolfram Kriesing, JavaScript Katas (2019)
jskatas.org
Compararea facilităților ECMAScript implementate de
instrumente, navigatoare Web și servere (2019)
kangax.github.io/compat-table/es2016plus/
Dr.SabinBuragaprofs.info.uaic.ro/~busaco
episodul viitor:
aplicații JavaScript cu Node.js

Contenu connexe

Tendances

Tendances (15)

CLIW 2015-2016 (9/13) Ingineria dezvoltării aplicațiilor JavaScript
CLIW 2015-2016 (9/13) Ingineria dezvoltării aplicațiilor JavaScriptCLIW 2015-2016 (9/13) Ingineria dezvoltării aplicațiilor JavaScript
CLIW 2015-2016 (9/13) Ingineria dezvoltării aplicațiilor JavaScript
 
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
CLIW 2015-2016 (4/13) Design Web. Proiectarea siturilor Web. Design Web respo...
 
CLIW 2015-2016 (5/13) Vizualizarea datelor – o privire de ansamblu
CLIW 2015-2016 (5/13) Vizualizarea datelor – o privire de ansambluCLIW 2015-2016 (5/13) Vizualizarea datelor – o privire de ansamblu
CLIW 2015-2016 (5/13) Vizualizarea datelor – o privire de ansamblu
 
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2015-2016 (11/13) Programare Web. API-uri JavaScript în contextul HTML5
 
CLIW 2017-2018 (5/12) Limbajul de programare JavaScript. Aspecte esenţiale
CLIW 2017-2018 (5/12) Limbajul de programare JavaScript. Aspecte esenţialeCLIW 2017-2018 (5/12) Limbajul de programare JavaScript. Aspecte esenţiale
CLIW 2017-2018 (5/12) Limbajul de programare JavaScript. Aspecte esenţiale
 
CLIW 2015-2016 (6/13) (Re)găsirea resurselor Web. De la motoare de căutare și...
CLIW 2015-2016 (6/13) (Re)găsirea resurselor Web. De la motoare de căutare și...CLIW 2015-2016 (6/13) (Re)găsirea resurselor Web. De la motoare de căutare și...
CLIW 2015-2016 (6/13) (Re)găsirea resurselor Web. De la motoare de căutare și...
 
Node.js: aspecte esențiale
Node.js: aspecte esențialeNode.js: aspecte esențiale
Node.js: aspecte esențiale
 
CLIW 2017-2018 (7/12) JavaScript în navigatorul Web. De la DOM la Ajax şi mas...
CLIW 2017-2018 (7/12) JavaScript în navigatorul Web. De la DOM la Ajax şi mas...CLIW 2017-2018 (7/12) JavaScript în navigatorul Web. De la DOM la Ajax şi mas...
CLIW 2017-2018 (7/12) JavaScript în navigatorul Web. De la DOM la Ajax şi mas...
 
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţialeSTAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
STAW 02/12: Programare Web: Limbajul JavaScript. Aspecte esenţiale
 
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #12): Programare Web....
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #12): Programare Web....Dezvoltarea aplicaţiilor Web la nivel de client (cursul #12): Programare Web....
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #12): Programare Web....
 
CLIW 2015-2016 (1/13) Interacțiune Web: concepte, context, studii de caz
CLIW 2015-2016 (1/13) Interacțiune Web: concepte, context, studii de cazCLIW 2015-2016 (1/13) Interacțiune Web: concepte, context, studii de caz
CLIW 2015-2016 (1/13) Interacțiune Web: concepte, context, studii de caz
 
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #8): Programare în li...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #8): Programare în li...Dezvoltarea aplicaţiilor Web la nivel de client (cursul #8): Programare în li...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #8): Programare în li...
 
CLIW 2014—2015 (7/12): Programare în limbajul JavaScript
CLIW 2014—2015 (7/12): Programare în limbajul JavaScriptCLIW 2014—2015 (7/12): Programare în limbajul JavaScript
CLIW 2014—2015 (7/12): Programare în limbajul JavaScript
 
CLIW 2017-2018 (8/12) Ingineria dezvoltării aplicaţiilor JavaScript
CLIW 2017-2018 (8/12) Ingineria dezvoltării aplicaţiilor JavaScriptCLIW 2017-2018 (8/12) Ingineria dezvoltării aplicaţiilor JavaScript
CLIW 2017-2018 (8/12) Ingineria dezvoltării aplicaţiilor JavaScript
 
Un mini-tutorial JavaScript
Un mini-tutorial JavaScriptUn mini-tutorial JavaScript
Un mini-tutorial JavaScript
 

Similaire à STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.

Javascript ajax tutorial
Javascript ajax tutorialJavascript ajax tutorial
Javascript ajax tutorial
Vlad Posea
 

Similaire à STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al. (20)

Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
Web 2020 11/12: Interacţiune Web asincronă. Aplicaţii Web de tip mash-up. JAM...
 
Web 2016 (05/13) Programare Web – Dezvoltarea aplicațiilor Web via Node.js
Web 2016 (05/13) Programare Web – Dezvoltarea aplicațiilor Web via Node.jsWeb 2016 (05/13) Programare Web – Dezvoltarea aplicațiilor Web via Node.js
Web 2016 (05/13) Programare Web – Dezvoltarea aplicațiilor Web via Node.js
 
STAW 08/12: Programare Web. Suita de tehnologii HTML5
STAW 08/12: Programare Web. Suita de tehnologii HTML5STAW 08/12: Programare Web. Suita de tehnologii HTML5
STAW 08/12: Programare Web. Suita de tehnologii HTML5
 
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
Web 2020 07/12: Procesarea datelor XML & HTML – Simple API for XML. Procesări...
 
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
Web 2020 04/12: Programare Web – Dezvoltarea aplicaţiilor Web în PHP
 
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScriptSTAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
STAW 07/12: Ingineria dezvoltării aplicaţiilor JavaScript
 
CLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScript
CLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScriptCLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScript
CLIW 2014—2015 (9/12): Ingineria dezvoltării aplicaţiilor JavaScript
 
Web 2016 (07/13) Modelarea datelor. Extragerea datelor cu XPath. Validări XML...
Web 2016 (07/13) Modelarea datelor. Extragerea datelor cu XPath. Validări XML...Web 2016 (07/13) Modelarea datelor. Extragerea datelor cu XPath. Validări XML...
Web 2016 (07/13) Modelarea datelor. Extragerea datelor cu XPath. Validări XML...
 
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uriSTAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
STAW 06/12: JavaScript în navigatorul Web. De la DOM la Ajax şi mash-up-uri
 
Web 2016 (09/13) Procesarea datelor XML & HTML. Simple API for XML. Procesări...
Web 2016 (09/13) Procesarea datelor XML & HTML. Simple API for XML. Procesări...Web 2016 (09/13) Procesarea datelor XML & HTML. Simple API for XML. Procesări...
Web 2016 (09/13) Procesarea datelor XML & HTML. Simple API for XML. Procesări...
 
CLIW 2017-2018 (11/12) Programare Web. API-uri JavaScript în contextul HTML5 ...
CLIW 2017-2018 (11/12) Programare Web. API-uri JavaScript în contextul HTML5 ...CLIW 2017-2018 (11/12) Programare Web. API-uri JavaScript în contextul HTML5 ...
CLIW 2017-2018 (11/12) Programare Web. API-uri JavaScript în contextul HTML5 ...
 
Javascript ajax tutorial
Javascript ajax tutorialJavascript ajax tutorial
Javascript ajax tutorial
 
CLIW 2014—2015 (11/12): Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2014—2015 (11/12): Programare Web. API-uri JavaScript în contextul HTML5CLIW 2014—2015 (11/12): Programare Web. API-uri JavaScript în contextul HTML5
CLIW 2014—2015 (11/12): Programare Web. API-uri JavaScript în contextul HTML5
 
WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An ...
WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An ...WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An ...
WADe 2017-2018 Tutorial (1/3): Web Application Development with Node.js – An ...
 
STAW 04/12: Programare Web: Node.js
STAW 04/12: Programare Web: Node.jsSTAW 04/12: Programare Web: Node.js
STAW 04/12: Programare Web: Node.js
 
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #9): JavaScript în na...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #9): JavaScript în na...Dezvoltarea aplicaţiilor Web la nivel de client (cursul #9): JavaScript în na...
Dezvoltarea aplicaţiilor Web la nivel de client (cursul #9): JavaScript în na...
 
Web 2016 (12/13) Interacțiune Web cu Ajax. Aplicații Web hibride (mash-up-uri)
Web 2016 (12/13) Interacțiune Web cu Ajax. Aplicații Web hibride (mash-up-uri)Web 2016 (12/13) Interacțiune Web cu Ajax. Aplicații Web hibride (mash-up-uri)
Web 2016 (12/13) Interacțiune Web cu Ajax. Aplicații Web hibride (mash-up-uri)
 
STAW 10/12: Programare Web. API-uri JavaScript în contextul HTML5 (II)
STAW 10/12: Programare Web. API-uri JavaScript în contextul HTML5 (II)STAW 10/12: Programare Web. API-uri JavaScript în contextul HTML5 (II)
STAW 10/12: Programare Web. API-uri JavaScript în contextul HTML5 (II)
 
CLIW 2014—2015 (8/12): JavaScript în navigatorul Web
CLIW 2014—2015 (8/12): JavaScript în navigatorul WebCLIW 2014—2015 (8/12): JavaScript în navigatorul Web
CLIW 2014—2015 (8/12): JavaScript în navigatorul Web
 
WADe 2014—2015 (supliment): Dezvoltare Web via node.js
WADe 2014—2015 (supliment): Dezvoltare Web via node.jsWADe 2014—2015 (supliment): Dezvoltare Web via node.js
WADe 2014—2015 (supliment): Dezvoltare Web via node.js
 

Plus de Sabin Buraga

Plus de Sabin Buraga (20)

Web 2020 01/12: World Wide Web – aspecte arhitecturale
Web 2020 01/12: World Wide Web – aspecte arhitecturaleWeb 2020 01/12: World Wide Web – aspecte arhitecturale
Web 2020 01/12: World Wide Web – aspecte arhitecturale
 
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni WebWeb 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
Web 2020 02/12: Programare Web – HTTP. Cookie-uri. Sesiuni Web
 
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie WebWeb 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
Web 2020 03/12: Programare Web – Arhitectura aplicaţiilor Web. Inginerie Web
 
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
Web 2020 05/12: Modelarea datelor. Familia XML. Extragerea datelor cu XPath. ...
 
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object ModelWeb 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
Web 2020 06/12: Procesarea datelor XML & HTML. Document Object Model
 
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
Web 2020 08/12: Servicii Web. De la arhitecturi orientate spre servicii la SO...
 
Web 2020 09/12: Servicii Web. Paradigma REST
Web 2020 09/12: Servicii Web. Paradigma RESTWeb 2020 09/12: Servicii Web. Paradigma REST
Web 2020 09/12: Servicii Web. Paradigma REST
 
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
Web 2020 10/12: Servicii Web. Micro-servicii. Serverless. Specificarea API-ur...
 
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţialeWeb 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
Web 2020 12/12: Securitatea aplicaţiilor Web. Aspecte esenţiale
 
STAW 01/12: Arhitectura aplicaţiilor Web
STAW 01/12: Arhitectura aplicaţiilor WebSTAW 01/12: Arhitectura aplicaţiilor Web
STAW 01/12: Arhitectura aplicaţiilor Web
 
STAW 05/12: Arhitectura navigatorului Web
STAW 05/12: Arhitectura navigatorului WebSTAW 05/12: Arhitectura navigatorului Web
STAW 05/12: Arhitectura navigatorului Web
 
STAW 09/12: Programare Web. API-uri JavaScript în contextul HTML5 (I)
STAW 09/12: Programare Web. API-uri JavaScript în contextul HTML5 (I)STAW 09/12: Programare Web. API-uri JavaScript în contextul HTML5 (I)
STAW 09/12: Programare Web. API-uri JavaScript în contextul HTML5 (I)
 
STAW 11/12: Performanţa aplicaţiilor Web la nivel de client
STAW 11/12: Performanţa aplicaţiilor Web la nivel de clientSTAW 11/12: Performanţa aplicaţiilor Web la nivel de client
STAW 11/12: Performanţa aplicaţiilor Web la nivel de client
 
STAW 12/12: (Re)găsirea resurselor Web. De la motoare de căutare şi SEO la da...
STAW 12/12: (Re)găsirea resurselor Web. De la motoare de căutare şi SEO la da...STAW 12/12: (Re)găsirea resurselor Web. De la motoare de căutare şi SEO la da...
STAW 12/12: (Re)găsirea resurselor Web. De la motoare de căutare şi SEO la da...
 
Sabin Buraga: Dezvoltator Web?! (2019)
Sabin Buraga: Dezvoltator Web?! (2019)Sabin Buraga: Dezvoltator Web?! (2019)
Sabin Buraga: Dezvoltator Web?! (2019)
 
HCI 2018 (2/10) Human Factor. From interaction idioms to human capacities & c...
HCI 2018 (2/10) Human Factor. From interaction idioms to human capacities & c...HCI 2018 (2/10) Human Factor. From interaction idioms to human capacities & c...
HCI 2018 (2/10) Human Factor. From interaction idioms to human capacities & c...
 
HCI 2018 (3/10) Design Models, Methodologies and Guidelines
HCI 2018 (3/10) Design Models, Methodologies and GuidelinesHCI 2018 (3/10) Design Models, Methodologies and Guidelines
HCI 2018 (3/10) Design Models, Methodologies and Guidelines
 
HCI 2018 (4/10) Information Architecture. From Design Patterns to Visual Design
HCI 2018 (4/10) Information Architecture. From Design Patterns to Visual DesignHCI 2018 (4/10) Information Architecture. From Design Patterns to Visual Design
HCI 2018 (4/10) Information Architecture. From Design Patterns to Visual Design
 
HCI 2018 (5/10) Information Architecture. From Design Patterns to Flow
HCI 2018 (5/10) Information Architecture. From Design Patterns to FlowHCI 2018 (5/10) Information Architecture. From Design Patterns to Flow
HCI 2018 (5/10) Information Architecture. From Design Patterns to Flow
 
HCI 2018 (6/10) Design Patterns for Social (Web/mobile) Interactions
HCI 2018 (6/10) Design Patterns for Social (Web/mobile) InteractionsHCI 2018 (6/10) Design Patterns for Social (Web/mobile) Interactions
HCI 2018 (6/10) Design Patterns for Social (Web/mobile) Interactions
 

STAW 03/12: Programare Web: Limbajul JavaScript. Aspecte moderne: ES6 et al.