原语是不可变的,没有办法改变它的价值。
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;这让我感到困惑?
答案 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
对象只是有一个扩展原型来提供功能。它不会改变底层基元的行为。