programowanieFrontend developer

Wyjaśnij różnicę między deklaracją zmiennych za pomocą let, const i var w TypeScript. Jak ich wybór wpływa na zakres widoczności, możliwość ponownego zadeklarowania, mutowalność wartości i ochronę przed błędami? Podaj przykłady typowych scenariuszy użycia każdej metody deklaracji.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

W TypeScript (jak i w nowoczesnym JavaScript) zmienne można deklarować z użyciem let, const i var, pomiędzy którymi istnieją istotne różnice:

  • let — Zakres blokowy, zmienną można nadpisać (przypisać nową wartość), ale nie można zadeklarować jej drugi raz w tym samym zakresie.
  • const — Również zakres blokowy, wartość musi być przypisana od razu, nie można jej nadpisywać (ale wewnętrzne właściwości obiektu zadeklarowanego przez const mogą być zmieniane!).
  • var — Zakres funkcjonalny, istnieje mechanizm podnoszenia (hoisting), zmienną można ponownie zadeklarować i zmienić.

Przykład:

if (true) { let a = 10; const b = 20; var c = 30; } console.log(c); // 30 — widoczna poza blokiem! console.log(a); // Błąd: a is not defined console.log(b); // Błąd: b is not defined

Typowe scenariusze:

  • const — dla wartości, które nie powinny się zmieniać (stałe, ustawienia, odwołania do funkcji).
  • let — dla wartości, które zmieniają się podczas wykonywania (liczniki, zmienne w pętli).
  • var — używać niezalecane, tylko dla wsparcia starszego kodu.

Pytanie podchwytliwe.

Czy const może uczynić obiekt całkowicie niemutowalnym? Wyjaśnij, podaj przykład.

Odpowiedź: Nie, const zapobiega jedynie zmianom samego odwołania, ale nie chroni przed zmianami właściwości obiektu!

const obj = { x: 1 }; obj.x = 2; // To jest dozwolone! obj = { x: 3 }; // Błąd: przypisanie nowego odwołania

Dla pełnej niemutowalności używaj Object.freeze:

const frozen = Object.freeze({ x: 1 }); frozen.x = 2; // Błąd w trybie ścisłym, ale nie zawsze kompilator ostrzega!

Przykłady rzeczywistych błędów wynikających z nieznajomości niuansów tematu.


Historia

W trakcie migracji dużego projektu frontendowego do TypeScript programiści masowo zastąpili var przez let, nie uwzględniając, że zakres widoczności stał się blokowy. Doprowadziło to do tego, że liczniki w niektórych pętlach for stały się niedostępne poza pętlą, co spowodowało nieoczekiwane błędy w logice: kod przestał działać przy próbach odwołania się do licznika pętli po zakończeniu pętli.


Historia

Programista zadeklarował stałą przez const w celu przechowywania obiektu konfiguracyjnego, sądząc, że właściwości są chronione przed zmianami. Później w czasie wykonywania inna część programu zmieniła właściwość: spowodowało to trudne do namierzenia błędy w przetwarzaniu danych, ponieważ zewnętrzny kod "nieoczekiwanie" zmienił globalne ustawienia dla wszystkich użytkowników.


Historia

W projekcie jednocześnie używano let, const i var bez wyraźnej polityki. Jeden komponent ponownie zadeklarował zmienną var w ramach funkcji, podczas gdy inna część oczekiwała, że zmienna została zadeklarowana przez let, a zatem na zewnątrz bloku nie będzie widoczna. Efekt: nakładanie się zmiennych, awarie wewnętrznej logiki i trudne debugowanie problemów z nieoczywistym cyklem życia zmiennych.