Dlaczego napisy w JavaScript są niemodyfikowalne?

Dlaczego napisy w JavaScript są niemodyfikowalne?
PK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 27
0

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

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
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ć?

neves
  • Rejestracja: dni
  • Ostatnio: dni
  • 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: dni
  • Ostatnio: dni
  • 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}
Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
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).

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.