Dlaczego napisy w JavaScript są niemodyfikowalne?

0

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

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ć?

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.

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.

const s = new String('dupa');
s.kupa = true;
s
//String {"dupa", kupa: true}
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).

1 użytkowników online, w tym zalogowanych: 0, gości: 1