JS中的包装对象(整理自JavaScript权威指南)

50 阅读2分钟

js中字符串属于基础类型,但也同样具有属性和方法,例:

var s = "hello world"  // 一个字符串
var world = s.substring(s.indexOf(" ")+1, s.length) // 使用字符串的属性

字符串既然不是对象,为什么它会有属性呢?只要引用了字符串s的属性,JavaScript就会将字符串值通过调用new String(s) 的方式转换成对象,这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会销毁(其实在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样)。

  数字和布尔值同理,通过Number()和Boolean()构造函数创建一个临时对象,这些方法的调用都是来自于这个临时对象。null和undefined没有包装对象:访问他们的属性会造成一个类型错误。

  看如下代码,思考执行结果:

var s = "test" // 创建一个字符串
s.len = 4; //给它设置一个属性
var t = s.len; // 查询这个属性

   当执行这段代码时,t的值是undefined。第二行代码创建一个临时字符串对象,并给其len属性赋值为4,随即销毁这个对象。第三行通过原始的(没有被修改过)字符串值创建一个新字符串对象,尝试读取其len属性,这个属性自然不存在,表达式求值结果为undefined。这段代码说明了在读取字符串、数字、布尔值的属性值或方法的时候,表现的像对象一样。但如果你试图给其属性赋值,则会忽略这个操作:修改只是发生在临时对象上,而这个临时对象并未继续保留下来。

  存取字符串、数字、布尔值的属性时临时创建对象称作包装对象。通常,包装对象只是被看作是一种实现细节,而不用特别关注。由于字符串、数组、bool值的属性都是只读的,并不能给它们定义新属性,因为需要明白,它们是有别于对象的。