Bunele mele practici – JavaScript
1. Dezactivează cache-ul
Firefox:
Deschide Developer Tools -> deschide setările (F1) -> "Disable HTTP Cache (when toolbox is open)"
Chrome:
Deschide Developer Tools -> deschide setările (F1) -> "Disable cache (while DevTools is open)"
2. Ține consola JS deschisă
În Dev Tools, deschide tabul Console și lasă-l deschis, ca pasul 1 să rămână activ și ca, în plus, să observi erorile de rețea și de JS.
Recomandat este și acest plugin, care afișează erorile JS și mai bine, pentru momentele în care uiți chiar tu de consolă:
3. JavaScript: lectură obligatorie „You Don't Know JS”
- You Don't Know JS (1st Edition)
- Explică de ce
thistrebuie evitat - Explică de ce în JS se întâmplă uneori lucruri aparent ciudate (cuvinte-cheie: lexical scope, closures)
4. Punctul și virgula
- Pune-l întotdeauna
- Nu este obligatoriu, dar te poate ajuta, de exemplu, să eviți această capcană: Stack Overflow
- JavaScript inserează automat un punct și virgulă:
// you want to return 5 and have ugly formatting:
return
5
// JavaScript Interpretation:
return;
5;
5. Operatorii logici && și ||
- În Java,
a && bșia || bsunt evaluate conform algebrei booleene.așibtrebuie să fie booleeni. - În JavaScript:
- La
a && bse returneazăbdacăaeste true - La
a || bse returneazăbdacăaeste false
- La
Și expresiile pot fi legate astfel, ceea ce permite cel mai scurt if-statement posibil – syntactic sugar:
isAdmin && showDeleteButton();- (Strict vorbind, asta nu mai este un statement)
Se folosește des și pentru valori implicite:
let sendNewsletter = form.getNewsletterOptIn() || false;
6. JavaScript este pass-by-reference sau pass-by-value?
În JavaScript, lucrurile sunt interesante. Exemplu:
function changeStuff(a, b, c) {
a = a * 10;
b.item = "changed";
c = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);
console.log(obj2.item);
Produce următorul output:
10
changed
unchanged
Dacă obj1 nu ar fi deloc o referință, atunci modificarea lui obj1.item nu ar avea niciun efect asupra lui obj1 din afara funcției.
Dacă argumentul ar fi o referință adevărată, atunci totul s-ar schimba: num ar fi 100, iar obj2.item ar conține „changed”. În schimb, num rămâne 10, iar
obj2.item rămâne „unchanged”.
De fapt, elementul transmis este transmis prin valoare. Numai că ceea ce se transmite prin valoare este, la rândul său, o referință. Tehnic, acest lucru se numește call-by-sharing.
În practică, asta înseamnă: dacă modifici parametrul însuși (ca la num și obj2), nu are niciun efect asupra obiectului original transmis funcției.
Dacă însă modifici valorile interne ale parametrului, aceste modificări se păstrează (ca la obj1).