对象包装器是否在JavaScript中是不可变的

时间:2015-10-10 12:37:40

标签: javascript

原语是不可变的,没有办法改变它的价值。

var a = 'abc';
a[0] = 'b';
console.log(a);// abc as it is immutable

但是,如果我使用包装器对象

var a = new String('abc');
typeof a// object
a[0] = 'b';
console.log(a);//  abc      <----- I actually expect it to be bbc as a is a object which by default should be mutable.

有人可以向我解释一下吗?这是我对&#34; mutable&#34;的概念的误解?和&#34;不可变的&#34;这让我感到困惑?

2 个答案:

答案 0 :(得分:2)

名称指示的对象包装器是一个包装器。 基元没有属性或方法,这是包装器发挥作用的地方,允许您拥有方法和属性。

这就是为什么

var a = 'abc';
a.slice(1)// <-- this only works because of a wrapper.

所以基本上string的包装器对象就是包装不可变的原语。

以非常抽象的方式

var str = new String("a");

就像

var str = {
   primitiveValue:"a",
   slice: function(myStr){//do something}
}

答案 1 :(得分:2)

在第二个示例中,String对象仍由原始字符串值支持。 &#34;包装&#34;对象中的值不会改变基础原语的不变性。

请参阅控制台的输出:

String {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}
0: "a"
1: "b"
2: "c"
length: 3
__proto__: String
[[PrimitiveValue]]: "abc"

String对象只是有一个扩展原型来提供功能。它不会改变底层基元的行为。