de Boris Sever

Ce este înregistrat în consolă atunci când mutați obiecte

Ce este inregistrat in consola atunci cand mutati obiecte

Mulți dezvoltatori nu folosesc un depanator în timpul dezvoltării. În schimb, se bazează pe vechiul lor prieten console.log().

Este important să rețineți că consola arată valoarea obiectului, care este evaluată în momentul efectuării prima expansiune în consolă.

Mai întâi, permiteți-mi să clarific ce vreau să spun prin extindere. Cand noi console.log un obiect (care acoperă și matrici), valoarea obiectului este prăbușită. De exemplu:

console.log( "users: ", [{name: "John"}]);

Consola browserului va arăta astfel:

1612001346 956 Ce este inregistrat in consola atunci cand mutati obiecte

Apoi, când faceți clic pe triunghi, obiectul se extinde. La acel moment exact, valoarea obiectului este evaluată și afișată.

Să ne aruncăm mai mult în acest sens și să vedem un exemplu:

Pe linia 1 inițializăm un nou users variabilă, care este o serie de obiecte.

Pe linia 6 scriem valoarea users variabilă la consolă.

Apoi, repetăm users, verificați dacă utilizatorul este valid și, în funcție de returnare, îl dezactivăm. Din motive de argument, să presupunem că validateUser()se intoarce false iar codul de pe linia 10 este executat.

Chiar dacă map creează o nouă matrice, schimbând user obiectul schimbă de asemenea user obiect în users matrice. Se schimbă pentru că are aceeași referință. (Pentru o explicație mai bună a ceea ce se întâmplă, verificați Acest articol ).

Întrebarea este: ce va fi afișat în consola care este apelată pe linia 6?

Când deschidem acest exemplu în Chrome și Firefox, obiectul este prăbușit. Apoi, după expansiune, vedem valorile:

1612001346 767 Ce este inregistrat in consola atunci cand mutati obiecte
1612001346 204 Ce este inregistrat in consola atunci cand mutati obiecte

Activat este setat la false, chiar dacă valoarea a fost true în momentul ieșirii. Motivul din spatele acestui fapt este că valoarea obiectului este evaluată pentru prima dată când facem clic pentru a extinde obiectul (citire leneșă).

Notă: Chrome va afișa o pictogramă de informații care afirmă: „Valoarea de mai jos a fost evaluată chiar acum”.

Să aruncăm o privire acum asupra Safari:

1612001346 148 Ce este inregistrat in consola atunci cand mutati obiecte
Safari (versiunea 11.0.3)

Hm, activat este setat la adevărat. Deci, putem vedea că există unele inconsecvențe între browsere. Safari va încerca să extindă automat obiectul. Dacă obiectul / matricea este prea mare, acesta se va prăbuși și se va comporta la fel ca Chrome și Firefox.

O modalitate de a evita acest lucru este de a folosi JSON.stringify(), de exemplu
console.log("users", JSON.stringify(users, null, 2));

care va produce următoarea ieșire către consolă:

1612001347 270 Ce este inregistrat in consola atunci cand mutati obiecte

Din păcate, cu această abordare nu puteți extinde / restrânge un obiect. Valoarea nu va fi mutată.

Sunt un mare fan al paradigmei funcționale de programare și a variabilelor imuabile. Pentru a modifica obiectul, creați o clonă care este apoi modificată. În acest caz, nu ați experimenta acest tip de „problemă”. Așa că am putea scrie așa ceva:

În funcția de hartă, acum clonăm obiectul utilizator pe care îl modificăm și îl returnăm.

În cazul în care rămâneți cu mutația obiectului, Zoran Jambor a adăugat o altă soluție inteligentă:
console.log("users", ...users);
Deci matricea de utilizatori este distrusă și o listă de obiecte este afișată în consolă:

1612001347 81 Ce este inregistrat in consola atunci cand mutati obiecte

Dar și aici trebuie să fim atenți. Dacă valoarea obiectului a fost mutată, ieșirea consolei se va modifica la extindere:

1612001347 605 Ce este inregistrat in consola atunci cand mutati obiecte

În cazul în care doriți să fiți absolut sigur că obiectul, care a fost înregistrat, are aceeași valoare ca în timpul console.log, va trebui să faceți o clonă profundă a acestuia. De exemplu, am putea folosi următoarea funcție de ajutor în loc să scriem direct pe consolă:

Pe linia 3 creăm de fapt o clonă profundă a obiectului, care dă următoarea ieșire:

1612001347 505 Ce este inregistrat in consola atunci cand mutati obiecte

Acum valoarea obiectului nu este modificată la extindere.

Dacă utilizați un depanator, adăugarea unui punct de întrerupere la linia 6 va întrerupe execuția. Veți vedea valoarea obiectului curent. Dacă preferați consola de cele mai multe ori, rețineți că obiectul / matricea este evaluat la prima expansiune.

Verifică acest mare articol despre cum să utilizați depanatorul browserului.

Mulțumesc că ai citit. Vă rugăm să îl împărtășiți cu oricine ar putea găsi util și lăsați feedback. (Aceasta este prima mea poveste pe Medium și aș vrea să continui să scriu și să mă îmbunătățesc).