Stringuri, numere și Intl
Metodele de zi cu zi, capcanele float-ului și formatare corectă.
Actualizat
Ce este un string
Un string e o secvență de caractere — text. Se scrie între ghilimele simple, duble sau backtick-uri:
| Sintaxă | Diferență | Când |
|---|---|---|
'text' |
— | implicit (convenția din majoritatea proiectelor) |
"text" |
identic cu ' |
când textul conține ' |
`text ${x}` |
template literal: interpolare + mai multe rânduri | când combini text cu variabile |
Stringurile sunt imutabile: nicio metodă nu modifică stringul original, toate returnează unul nou.
const s = 'salut'
s.toUpperCase() // 'SALUT'
s // 'salut' — neschimbatMetodele de zi cu zi, pe categorii
| Vrei să... | Metodă | Exemplu |
|---|---|---|
| cureți spațiile | trim(), trimStart(), trimEnd() |
' a '.trim() → 'a' |
| schimbi litere | toLowerCase(), toUpperCase() |
comparații fără diferență de majuscule |
| cauți | includes(), startsWith(), endsWith(), indexOf() |
email.includes('@') |
| extragi | slice(start, end), at(-1) |
'hello'.slice(0, 3) → 'hel' |
| împarți / unești | split(sep) / arr.join(sep) |
'a,b'.split(',') → ['a', 'b'] |
| înlocuiești | replace(), replaceAll() |
'a-b-c'.replaceAll('-', ' ') |
| completezi | padStart(), padEnd() |
'5'.padStart(2, '0') → '05' |
| repeți | repeat(n) |
'ab'.repeat(2) |
slice vs substring: folosește slice — acceptă și indici negativi (slice(-3) = ultimele 3 caractere).
Pentru tipare complexe (validări, extrageri) există expresiile regulate: /\d+/.test('abc123').
Ce este un number
JS are un singur tip pentru numere: number — virgulă mobilă pe 64 de biți (standardul IEEE 754). Întregi și zecimale sunt același tip.
Consecința celebră:
0.1 + 0.2 // 0.30000000000000004Nu e un bug JS — așa funcționează virgula mobilă în aproape toate limbajele. Pentru bani, lucrezi în bani întregi (1999 în loc de 19.99) și formatezi doar la afișare.
Valori speciale
| Valoare | Când apare | Cum o verifici |
|---|---|---|
NaN („not a number”) |
conversie eșuată: Number('abc') |
Number.isNaN(x) — nu x === NaN (e mereu false) |
Infinity |
1 / 0 |
Number.isFinite(x) |
Number.MAX_SAFE_INTEGER |
~9 milioane de miliarde | peste el → bigint |
Conversii string ↔ number
| Metodă | '42' |
'42px' |
'' |
Când |
|---|---|---|---|---|
Number(x) |
42 | NaN |
0 | conversie strictă — implicit |
parseInt(x, 10) |
42 | 42 | NaN |
citești un număr de la începutul unui text |
parseFloat(x) |
42 | 42 | NaN |
la fel, cu zecimale |
+x |
42 | NaN |
0 | prescurtare pentru Number (mai puțin lizibilă) |
String(n), `${n}` |
— | — | — | număr → text |
Valorile din input-uri și din FormData sunt mereu string. Le convertești explicit.
Math
Math.round(2.5) // 3
Math.floor(2.9) // 2 (în jos)
Math.ceil(2.1) // 3 (în sus)
Math.max(1, 5, 3) // 5
Math.min(...arr) // minimul dintr-un array
Math.random() // [0, 1)
(3.14159).toFixed(2) // '3.14' — atenție, returnează STRINGIntl — formatare corectă, fără librării
Intl e API-ul nativ pentru formatare după limbă și țară. Nu mai scrie de mână separatori de mii sau nume de luni.
| Formatter | Pentru | Exemplu (ro-RO) |
|---|---|---|
NumberFormat |
numere, monedă, procente | 1.234,50 RON, 45% |
DateTimeFormat |
date și ore | 8 octombrie 2026 |
RelativeTimeFormat |
timp relativ | ieri, peste 3 zile |
PluralRules |
alegerea formei de plural | 1 mesaj / 5 mesaje / 20 de mesaje |
ListFormat |
liste | HTML, CSS și JS |
const money = new Intl.NumberFormat('ro-RO', { style: 'currency', currency: 'RON' })
money.format(1234.5) // '1.234,50 RON'
new Intl.DateTimeFormat('ro-RO', { dateStyle: 'long' }).format(new Date())
new Intl.RelativeTimeFormat('ro', { numeric: 'auto' }).format(-1, 'day') // 'ieri'Creează formatter-ul o dată (în afara funcției / componentei) și refolosește-l — crearea e costisitoare.
Pe scurt
- Stringurile sunt imutabile; template literals pentru interpolare.
- Un singur tip
number; bani în întregi;Number.isNaNpentru NaN. - Input-urile dau stringuri — convertește cu
Number(). - Formatare:
Intl, nu concatenare manuală.