为了便于操作基本类型值,ECMAScript提供了3个特殊的应用类型:Boolean、Number和String。这些类型和其他引用类型相似,但具有与各自基本类型相应的特殊行为。每当读取一个基本类型值时,后台会创建一个对应的基本包装类型的对象。一般在后台都会进行这样的处理:
(1)创建Boolean/Number/String类型的一个实例;
(2)在实例上调用指定的方法;
(3)销毁这个实例。
下面举个例子:
var s1="some text";
var s2=s1.substring(2);
实际上可以想象成下列ECMAScript代码:
var s1=new String("some text");
var s2=s1.substring(2);
s1=null;
【注意】引用类型与基本包装类型的主要区别是对象的声明周期。
对于使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都是一直保存在内存中,而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着不能在运行时为基本包装类型值添加属性和方法。
如下面例子:
var s1="some text";
s1.color="red";
alert(s1.color);//undefined
虽然第二行中为s1添加了一个color属性,但是在第三行代码中再访问s1时,其color属性已经不存在,这是因为第二行创建的String对象在执行第三行代码时已经被销毁,第三行又创建了自己的String对象,而该对象没有color属性。
【注意】使用new调用基本包装类型的构造函数,与直接调用同名的转型函数是不一样的。
如下:
var value=25;
var number=Number(value);//转型函数
alert(typeof number);//"number"
var obj=new Number(value);//构造函数
alert(typeof obj);//"object"