Operatori
Lista de operatori
Operator | Operație | A | N | Tip date |
---|---|---|---|---|
++ | incrementare | D | 1 | num > num |
-- | decrementare | D | 1 | num > num |
- | neagă număr | D | 1 | num > num |
+ | transformă în număr | D | 1 | orice > num |
~ | inversează biți | D | 1 | orice > int |
! | negare | D | 1 | orice > bool |
delete | șterge o proprietate | D | 1 | orice > bool |
typeof | întoarce tipul de date ale valorii | D | 1 | orice > str |
void | întoarce undefined | D | 1 | orice > undef |
*, / | înmulțire, împărțire | S | 2 | num > num |
% | modulo | S | 2 | num > num |
+, - | adunare, scădere | S | 2 | num > num |
+ | concatenare | S | 2 | str, orice > str |
<< | deplasare stânga | S | 2 | int > int |
>> | deplasare dreapta cu semn | S | 2 | int > int |
>>> | deplasare dreapa fără semn | S | 2 | int > int |
<, <=, >, >= | comparație oridne numerică | S | 2 | num > bool |
<, <=, >, >= | comparație ordine alfabetică | S | 2 | str > bool |
instanceof | verifică clasa obiectului | S | 2 | ob, func > bool |
in | verifică dacă proprietatea există | S | 2 | str, ob > bool |
== | verifică egalitatea | S | 2 | orice > bool |
!= | verifică inegalitatea | S | 2 | orice > bool |
=== | verifică egalitatea strict | S | 2 | orice > bool |
!== | verifică inegalitatea strict | S | 2 | orice > bool |
& | ȘI pe biți | S | 2 | int > int |
^ | XOR pe biți | S | 2 | int > int |
| | SAU pe biți | S | 2 | int > int |
&& | ȘI logic | S | 2 | orice > orice |
|| | SAU logic | S | 2 | orice > orice |
?: | alege al doilea sau al trilea operand | D | 3 | bool, orice > orice |
= | atribuie valoare | D | 2 | orice > orice |
*=, /=, %=, +=, == | calculează și atribuie | D | 2 | orice > orice |
, | întoarce al doilea operand | S | 2 | orice > orice |
Numărul de operanzi
- operatori unari (+x)
- operatori binari (x + 5)
- operator terțar (x ? x + 1 : x - 1)
Prioritatea operațiilor
Dacă avem mai multe operații într-o singură expresie, ele vor fi interpretate câte una în ordinea priorităților. Tabela de mai sus este ordonată crescător, cele de la început de tabelă având prioritate în mare parte.
Regula priorităților e simplă: mai întâi se execută operatorii unari, apoi înmulțirea/împărțirea, apoi adunarea/scăderea, apoi restul.
Pentru a modifica ordinea operațiilor se folosesc paranteze () pentru a izola operațiile prioritare.
Asociativitatea operatorilor
Coloana A din tabelă reprezintă asociativitatea operatorilor și are valoarea S (stânga) pentru a specifica asociativitatea stânga spre dreapta, și D (dreapta) pentru a specifica asociativitatea dreapta spre stânga.
- Stânga spre dreapta:
s = a - b - c
e la fel cus = ((a - b) - c)
- Dreapta spre stânga:
d = a = b = c
e la fel cud = (a = (b = c))
Operatori aritmetici
În JS avem operațiile aritmetice de bază: +, -, *, /, %
- ambii operanzi sunt transformați în numere, NaN dacă nu are valoare numerică (excepție +)
- atunci când se face adunarea / concatenarea (+)
- dacă oricare dintre operanzi este un obiect, atunci este transformat într-o primitivă (folosind valueOf() sau toString())
- apoi se verifică dacă cel puțin unul din operanzi este un string, atunci și celălalt este transformat în string și se face concatenarea
- dacă nu, ambii operanzi sunt transformați în numere (NaN dacă nu are valoare numerică) și se face adunarea
- dacă oricare dintre operanzi este NaN, atunci rezultatul operației va fi NaN
Operatorul modulo (%)
Operatorul modulo întoarce restul împărțirii.
A / B = C + R
=> C * B + R = A
=> A % B = R
unde C este un număr întreg. Altfel zis, modulo ne va zice cât anume ne rămâne dacă vrem să incadrăm pe B în A de un număr (indiferent de valoarea acelui număr) întreg de ori.
Două lucruri importante de știut:
- modulo funcționează și cu numere cu virgulă (floating-point)
- semnul rezultatului este semnul primului operand
Egalitatea și egalitatea strictă (==, ===)
Egalitatea simplă (==) sau egalitatea abstractă. Comparația x == y va întoarce true sau false, urmând următoarele verificări:
- dacă
Type(x)
șiType(y)
sunt la fel => se face egalitatea strictăx === y
- dacă
x
estenull
șiy
esteundefined
(sau invers) =>true
- dacă
Type(x)
esteNumber
șiType(y)
esteString
(sau invers) =>x == ToNumber(y)
- dacă
Type(x)
esteBoolean
(sau invers) =>ToNumber(x) == y
- dacă
Type(x)
esteString
,Number
sauSymbol
șiType(y)
esteObiect
(sau invers) =>x == ToPrimitive(y)
- =>
false
Egalitatea strictă (===). Comparația x === y
va întoarce true
sau false
, urmând urmatoarele verificări:
- dacă
Type(x)
este diferit deType(y)
=>false
- dacă
Type(x)
esteNumber
, atunci:- dacă
x
esteNaN
(sau invers) =>false
- dacă
x
șiy
au aceeași valoare numerică =>true
- dacă
x
este+0
șiy
este-0
(sau invers) =>true
- =>
false
- dacă
- dacă
Type(x)
esteUndefined
sauNull
=>true
- dacă
Type(x)
esteString
,Boolean
sauSymbol
șix
șiy
au aceeași valoare =>true
- dacă
x
șiy
indică către același obiect =>true
- =>
false
Operatorii condiționali (<, >, <=, >=)
Compararea se poate face doar pe numere sau strings (alfabetic), dar operanzii pot avea orice tip de date. Astfel, se aplică următoarele verificări:
- dacă oricare din operanzi este un obiect, atunci el se transformă în primitivă și se trece la următorul pas
- dacă ambii operanzi sunt strings, atunci se compară valoarea lor aflabetic
- altfel, ambii operanzi sunt transformați în numere și se face comparația numerică
Infinity
este cel mai mare număr-Infinity
este cel mai mic număr- dacă unul din operanzi este
NaN
=>false
Operatorii in și instanceof
const x = { a: 'first', b: 'second' };
'a' in x; // true
'c' in x; // false
'toString' in x; // true, prototypes
const date = new Date();
date instanceof Date; // true
date instanceof Object; // true
date instanceof Number; // false
Truthy / Falsy
Orice expresie evaluată ca și adevăr este considerată truthy, altfel, este falsy.
Oricare din aceste valori este falsy: false
, null
, undefined
, 0
, NaN
, ""
Restul, sunt considerate truthy.
Operatori logici
Operatorul ȘI &&
logic va întoarce true dacă ambii operanzi sunt true. Dacă cel puțin un operand este false, înseamnă că și rezultatul va fi false.
Operatorul SAU ||
logic va întoarce true dacă cel puțin un operand este true. Dacă ambii operanzi sunt false, înseamnă că și rezultatul va fi false.
Operatorii ȘI și SAU au un comportament foarte interesant în JS: datorită faptului că orice valoarea poate fi evaluată ca și truthy sau falsy, acești operatori pot întoarce o valoare truthy sau falsy (nu neapărat true
sau false
), astfel, putem decide rezultatul acestor operații simplu evaluând primul operand. Fie operanzii x
și y
, avem:
- ȘI - dacă
x
este truthy =>y
, altfel =>x
- SAU - dacă
x
este truthy =>x
, altfel =>y
Astfel, în cazul ȘI al doilea operand nu va fi evaluat dacă primul este falsy, iar în cazul SAU al doilea nu va fi evaluat dacă primul este truthy.
Operatorul de negare !
va inversa o valoare booleana, transformând o valoare falsy în true
și o valoare truthy în false
. Dacă îl aplicăm de două ori pe o variabilă, vom transforma acea variabilă în true
sau false
: !!x
Operatorii booleani pot fi descriși și prin următoarele tabele (unde a și b sunt datele de intrare și r este răspunsul):
ȘI / AND
a | b | r |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
SAU / OR
a | b | r |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Negare / NOT
a | r |
---|---|
0 | 1 |
1 | 0 |