包装对象的显式创建

3
我理解的包装对象是:如果我们声明一个原始类型并访问一些属性,那么包装对象会在内部创建,一旦操作完成,它就被丢弃。例如:
var str1="Stack"
str1.length=10
str1.length

第三行将给我5,因为第二行操作是在临时对象上完成的,第三行将创建一个新的临时对象。
但是,如果我明确地创建自己的包装对象,例如:
var str1=new String("Stack")
str1.length=100
str1.length

为什么我得到了5呢?这里我没有使用临时包装对象,因为操作完成后它会被丢弃。我使用的是专用包装对象,那么为什么它不允许我赋值长度呢?如果不能设置长度,那么为什么Javascript允许我设置长度呢?能否有人详细解释一下。

1个回答

3
根据JavaScript规范字符串长度是不变的。因此,您的代码"str1.length = value"没有任何作用。
通过构造函数创建字符串——var str1=new String("Stack")——或通过普通创建——var str1="Stack"——会创建不同类型的对象。但是,由于它们的原型相同(proto:String),长度仍然不变。

长度

由该字符串对象表示的字符串值中的元素数。

一旦初始化了字符串对象,此属性就不会改变。它具有以下属性:{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}。

请参见下面的示例代码:
var str1 = "Stack"
var str2 = new String("Stack")
str1 === str2
false
typeof str1
"string"
typeof str2
"object"
str1
"Stack"
str2
String {0: "S", 1: "t", 2: "a", 3: "c", 4: "k"
, length: 5
, [[PrimitiveValue]]: "Stack"}0: "S"1: "t"2: "a"3: "c"4: "k" length: 5
__proto__: String
[[PrimitiveValue]]: "Stack"

是的,这就是我一直在寻找的......该死,我应该也花点时间在proto上......我将可写属性设置为false,这就是原因......我相信如果我在严格模式下运行,赋值操作会给我一个错误而不是如此顺从。谢谢Atilla。 - user2485435

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接