Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象包装器在JavaScript中是不可变的吗_Javascript - Fatal编程技术网

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

对象包装器在JavaScript中是不可变的吗,javascript,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

原语是不可变的,无法更改其值

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.
var a=新字符串('abc');
//对象的类型
a[0]=“b”;

console.log(a);//abc名称所示的对象包装器是一个包装器。 原语没有属性或方法,这是包装器发挥作用的地方,允许您拥有方法和属性

这就是为什么

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

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

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

这就是为什么

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

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

在第二个示例中,
String
对象仍然由一个基本字符串值支持。“包装”对象中的值不会更改基础原语的不变性

请参阅控制台的输出:

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

字符串
对象只是有一个扩展原型来提供功能。它不会更改基础基元的行为。

在第二个示例中,
字符串
对象仍然由基元字符串值支持。“包装”对象中的值不会更改基础原语的不变性

请参阅控制台的输出:

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

字符串
对象只是有一个扩展原型来提供功能。它不会改变底层原语的行为。

可能与我实际通读了那篇文章的内容相同,但找不到答案没有“包装器”对象,
new String()
创建了一个String对象。您不能引用或修改内部字符串值,只能读取它(例如,使用valueOf)。在调用方法时,为了方便起见,这允许将原语视为对象,但不允许赋值(如果可能的话,这会使生活变得非常混乱)。可能与我读过的那篇文章有重复,但找不到答案没有“包装器”对象,
new String()
创建字符串对象。您不能引用或修改内部字符串值,只能读取它(例如,使用valueOf)。在调用方法时,为了方便起见,这允许将原语视为对象,但不允许赋值(如果可能的话,这会使生活变得非常混乱)。
var a=new String('abc')a是一个对象,而不是基元。那么为什么它仍然是不可更改的,因为它所处理的底层数据是不可更改的。这是一个语言设计决策。一个特性不是bug,如果你愿意的话。
var A=newstring('abc')a是一个对象,而不是基元。那么为什么它仍然是不可更改的,因为它所处理的底层数据是不可更改的。这是一个语言设计决策。一个特性不是bug,如果你愿意的话。所以包装器对象和其他对象是有区别的。我尝试下面的
vara={0:“a”};a[0]=2;a//Object{0:2}
这里,对象是changedNo,实际上没有“包装器对象”这样的东西。在您的示例中,您创建了一个在成员0处具有值的对象,然后重新分配了该成员0的引用。实际上,您从未更改最初设置的字符串的值,只需更改对象的该成员对哪个字符串进行寻址。字符串原型只提供可以对原语进行操作的函数。无法更改原语,但可以重新分配变量。您始终可以为任何对象设置(分配)变量,但值本身是否可变是另一个问题。也就是说,您始终可以实现自己的字符串原型或函数,这些函数的行为似乎与基础值是可变的。但原语永远不会是可变的。这样的原型只需为基础变量分配一个新值,而不是实际更改一个不可变的原语。因此包装器对象和其他对象之间存在差异。我尝试下面的
vara={0:“a”};a[0]=2;a//Object{0:2}
这里,对象是changedNo,实际上没有“包装器对象”这样的东西。在您的示例中,您创建了一个在成员0处具有值的对象,然后重新分配了该成员0的引用。实际上,您从未更改最初设置的字符串的值,只需更改对象的该成员对哪个字符串进行寻址。字符串原型只提供可以对原语进行操作的函数。无法更改原语,但可以重新分配变量。您始终可以为任何对象设置(分配)变量,但值本身是否可变是另一个问题。也就是说,您始终可以实现自己的字符串原型或函数,这些函数的行为似乎与基础值是可变的。但原语永远不会是可变的。这样的原型只需为基础变量分配一个新值,而不是实际更改一个不可变的原语。