Transformarea datelor
Nu rareori apare necesitatea de a transforma un set de date în altul. Unele transformări sunt efectuate automat de către JavaScript. De exemplu:
const number1 = "56";
const number2 = 4;
cont result = number1 + number2;
console.log(result); // 564
Aici, constanta number1 reprezintă un șir de caractere, mai precis, reprezentarea sub formă de șir a unui număr. În schimb, constanta number2 reprezintă un număr. În rezultat, nu vom obține numărul 60, ci șirul "564".
La adunare, conversiile în JavaScript sunt efectuate după următorul principiu:
- Dacă ambii operanzi sunt reprezentări numerice, atunci are loc adunarea aritmetică obișnuită.
- Dacă condiția anterioară nu este îndeplinită, atunci ambii operanzi sunt convertiți în șiruri și se realizează concatenarea acestora.
Prin urmare, în exemplul de mai sus, deoarece primul operand este un șir, atunci și al doilea operand, care este un număr, este convertit într-un șir, rezultând șirul "564", nu numărul 60. Practic, obținem:
const number1 = "56";
const number2 = 4;
const result = number1 + String(number2);
console.log(result); // 564
Expresia String(number2) permite obținerea unei reprezentări sub formă de șir a constantei number2, adică, din numărul 4, obținem șirul "4".
Cu toate acestea, comportamentul implicit nu este întotdeauna dorit. De exemplu, în exemplul de mai sus, dorim ca valorile să fie adunate nu ca șiruri, ci ca numere. În acest caz, putem utiliza funcțiile de conversie.
parseInt().
Pentru a converti un șir într-un număr întreg, se folosește funcția parseInt():
const number1 = "56";
const number2 = 4;
const result = parseInt(number1) + number2;
console.log(result); // 60
Cu toate acestea, șirul poate să aibă conținut mixt, de exemplu, "123hello", adică în acest caz există cifre, dar există și caractere obișnuite. Funcția parseInt() totuși va încerca să efectueze conversia - ea citeste în mod secvențial cifrele începând cu primul caracter, până când întâlnește primul caracter care nu este o cifră:
const num1 = "123hello";
const num2 = parseInt(num1);
console.log(num2); // 123
Trebuie să se țină cont de faptul că valoarea care este convertită într-un număr, este întotdeauna mai întâi convertită într-un șir. Acest lucru poate duce la rezultate aparent neașteptate la prima vedere:
const number1 = parseInt(0.000005); // 0;
console.log(number1);
const number2 = parseInt(0.0000005); // 5
console.log(number2);
Mai sus, sunt furnizate numere fractionare funcției parseInt, și ne așteptăm să obținem valoarea 0 în ambele cazuri. Cu toate acestea, la conversia lui number2, obținem valoarea 5. De ce?
Exemplul de mai sus va fi echivalent cu următorul:
const number1 = parseInt(String(0.000005)); // 0;
console.log(number1);
const number2 = parseInt(String(0.0000005)); // 5
console.log(number2);
Pentru numere fractionare mai mici de 10^(-6) (0,000001), este utilizată notația expoțială, adică numărul 0,0000005 este reprezentat ca 5e-7:
console.log(0.0000005); // 5e-7
Ulterior, numărul 5e-7 este transformat în șirul "5e-7", iar acest șir este încercat să fie convertit înapoi într-un număr folosind parseInt. Prin urmare, rezultatul este numărul 5.
Același principiu se aplică și pentru numere extrem de mari, cum ar fi 999999999999999999999, care sunt reprezentate în forma exponențială.
NaN și isNaN
Dacă funcția parseInt() nu poate efectua conversia, ea returnează valoarea NaN (Not a Number), ceea ce indică faptul că șirul nu reprezintă un număr și nu poate fi convertit.
console.log(parseInt("abc")); // NaN
cont type = typeof NaN;
console.log(type); // number
Ceea ce este interesant, valoarea NaN (Not a Number) în sine reprezintă tipul number, adică este o valoare numerică.
Cu ajutorul funcției speciale isNaN(), se poate verifica dacă un șir reprezintă un număr. Dacă șirul nu reprezintă un număr, atunci funcția returnează true, iar dacă este un număr, returnează false:
const num1 = "javascript";
const num2 = "22";
let result = isNaN(num1);
console.log(result); // true - num1 nu este o cifra
result = isNaN(num2);
console.log(result); // false - num2 - este cifra
parseFloat.
Pentru a converti șiruri în numere fractionare, se utilizează funcția parseFloat(), care funcționează în mod similar:
const number1 = "46.07";
const number2 = "4.98";
let result = parseFloat(number1) + parseFloat(number2);
console.log(result); //51.05
Conversia de la șir la număr și operatorul +
Este de remarcat faptul că, pentru a converti un șir într-un număr în JavaScript, putem folosi operatorul de adunare unară (+) înaintea valorii de convertit:
const number1 = "56";
const number2 = 4;
const result = +number1 - number2;
console.log(result); // 52
Aici, expresia +number1 transformă șirul "56" în numărul 56.
Dacă se dorește obținerea unei reprezentări negative a numărului, se aplică în mod similar semnul minus unar (înaintea numerelor negative):
const number1 = "56";
const number2 = 4;
const result = -number1 - number2; // -56 - 4 = -60
console.log(result); // -60
Cu toate acestea, în exemplele anterioare, șirul number1 ar fi putut fi convertit într-un număr. Dacă aceasta nu este posibil, rezultatul conversiei va fi valoarea NaN (Not a Number):
const number1 = "56hek";
console.log(+number1); // NaN