you can reassign a variable at will, that's no biggie.
what you can't do is modify it without the re-assignment, or simply without using the "=" char...
with an array, you can say x=[1,2,3]; x.reverse(); alert(x); to see 3.
you can't do that with a string: all the String.prototoype method like bold() and replace() return new strings: the value to the left of the dot that's to the left of the method call never changes, even if something different comes out of the right-hand side of the method call.
contrast this with arrays, where a pop() or push() changes the value to the left of the dot that's to the left of the method call.
one more way of saying it: if something is immutable, you cannot create a prototype method that alters the 'this' value, only one that returns something new.
this is related to, but not the same as the passing byRef and byVal effects described in post #3.