Dlaczego napisy w JavaScript są niemodyfikowalne?

Dlaczego napisy w JavaScript są niemodyfikowalne?
PK
  • Rejestracja:około 5 lat
  • Ostatnio:prawie 5 lat
  • Postów:27
0

Czemu taki zabieg został wprowadzony, czemu ogólnie ma to służyć w językach programowania?

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
2

Żeby mniej błędów powodować i żeby móc łatwiej debugować.
Pierwszy link z google Czym jest niezmienność (immutability) obiektów i kiedy warto z niej korzystać?


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
neves
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 7 godzin
  • Lokalizacja:Kraków
  • Postów:1114
3

Ponieważ w Java napisy są niemodyfikowalne, a JavaScript została stworzona na podobieństwo Java. Natomiast w Jave napisy są niemodyfikowalne ze względu na bezpieczeństwo, gdy Java powstawała obsługa łańcuchów tekstowych w C/C++ była problematyczna i rodziła wiele problemów z bezpieczeństwem, więc w Jave postanowili wyeliminować te problemy czynią łańcuchy znakowe niemodyfikowalnymi. Cała reszta zalet wynikająca z użycia niemodyfikowalnych obiektów to tylko wyłącznie skutki uboczne a nie przyczyna uczynienia stringów niemodyfikowalnymi.


Haskell
  • Rejestracja:prawie 10 lat
  • Ostatnio:12 miesięcy
  • Postów:4700
2

Typ napisowy "string" jest typem prymitywnym istniejącym już w dawnych wersjach JavaScript. Obecnie typów prymitywnych jest już siedem: string, number, bigint, boolean, null, undefined, symbol. Wszystkie typy prymitywne są niemutowalne (immutable) i dzieje się tak dlatego, że ze względu na wydajność i bezpieczeństwo są zaimplementowane na najniższym poziome języka i nie są one obiektami.

W JavaScript jednakże istnieje również prototyp String. Obiekty utworzone za pomocą tego prototypu, podobnie jak wszystkie inne obiekty w JavaScript są domyślnie mutowalne.

Kopiuj
const s = new String('dupa');
s.kupa = true;
s
//String {"dupa", kupa: true}

Zaglądali do kufrów, zaglądali do waliz, nie zajrzeli do d**y - tam miałem socjalizm. Czesław Miłosz
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 14 godzin
2

Java ma "mutowalne Stringi" pod postacią chociażby StringBuildera. Zarówno java.lang.String jak i java.lang.StringBuilder implementują interfejs java.lang.CharSequence, więc jak ktoś lubi to może używać wszędzie CharSequence. Interfejs CharSequence zawiera w Javie 8 metodę codePoints zwracającą strumień zdekodowanych znaków i można go spokojnie użyć do np serializacji.

Niemutowalność Stringa sprawia, że nie wymaga synchronizacji (przy programowaniu współbieżnym), defensywnych kopii (gdy nie wiemy czy ktoś nam może namieszać w Stringu), a także że jego zawartość może zostać bezpiecznie zdeduplikowana przez JVMkę (np https://openjdk.java.net/jeps/192 ) albo przekonwertowana do bardziej kompaktowej reprezentacji ( https://openjdk.java.net/jeps/254 ). W rzadkich przypadkach, gdy trzeba zmontować Stringa z kawałków korzysta się ze StringBuildera i na końcu konwertuje go do Stringa (zwykły toString wystarcza).


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
Haskell
Chodziło o inny język. Btw. w JavaScript też mamy obiekty String oraz StringBuilder, którymi można budować mutowalne stringi. Ale żeby było trochę inaczej niż w Javie konkatenacja napisów wcale nie działa szybciej w StringBuilder :D
Wibowit
Dyskusja jest nie tylko o JSie. OP napisał: "Czemu taki zabieg został wprowadzony, czemu ogólnie ma to służyć w językach programowania?"
Haskell
Być może. Op zapytał w tytule konkretnie o JS, stąd tak wywnioskowałem. Ciężko mi jeszcze odgadnąć myśli innych ludzi :D
Wibowit
W Javie wydajność łączenia napisów za pomocą operatora + to (była przed Javą 9?) wydajnościowa ruletka. Różne kompilatory Javy różnie to implementują, a różne JVMki wykrywają tylko niektóre sekwencje i podmieniają na wyżyłowane wyspecjalizowane implementacje. Szczegóły np: https://openjdk.java.net/jeps/280 https://shipilev.net/talks/joker-Oct2014-string-catechism.pdf
Haskell
Dzięki. Nie jestem specjalistą od Javy, więc nie wiem, polegam na opiniach książek/źródeł które polecają do konkatenacji używać StringBuildera ze względu na wydajność.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.