Most of the time, a primitive value is represented directly at the lowest level of the language implementation.
All primitives are immutable; that is, they cannot be altered. It is important not to confuse a primitive itself with a variable assigned a primitive value. The variable may be reassigned to a new value, but the existing value can not be changed in the ways that objects, arrays, and functions can be altered. The language does not offer utilities to mutate primitive values.
"foo".includes("f") implicitly creates a
String wrapper object and calls
str.foo = 1 is not assigning to the property
str itself, but to an ephemeral wrapper object).