In general, yes, objects are mutable.
The reason that "string objects" - created with new String
- are not mutable is that string objects result in objects which have an internal StringData
property:
Set S.[[StringData]] to value.
That StringData
is what is retrieved when the string object is coerced back to a primitive.
If the interpreter provided a way to change this StringData
internal slot - then these sorts of objects would effectively be mutable. (Similarly, Set.add
changes a Set's internal slot, and the same sort of mechanism exists for many other objects in JS - an exposed method changes values held in internal slots.)
But
a.toUpperCase();
alone wouldn't do anything - toUpperCase
returns a new string. There are no methods (in standard implementations) that exist that can alter a string object's StringData
internal slot - all you can do is create a new string object with a different StringData
.
You could also strongly consider just not using string objects at all.