作者:zhanhailiang 日期:2012-12-20
首先,请给出下列代码的输出:
var s = "hello world";
String.prototype.typeof = function() {
console.log(typeof(this));
}
console.log(typeof(s)); //(1)
console.log(typeof String(s)); //(2)
console.log(typeof new String(s)); //(3)
s.typeof(); //(4)
我们可以得到输出为:
string
string
object
object
接下来来解释下包装对象。我们知道JS中包含三个关键的基本数据类型——数字,字符串,布尔值,而其相应都有一个对象类——Number,String,Boolean类。这些类是那些基本数据类型的包装。这些包装(wrapper)不仅具有和基本类一样的值,还定义了用来运算数据的属性和方法。
JS可以很灵活地将一种类型的值转换成另一种类型。当我们在对象环境中使用字符串时(即s.typeof()),JS会为这个字符串值内部地创建一个String包装类。String对象就代替了原始的字符串值,从而可以调用typeof方法。(对其它基本类型的值同样可以这样调用)
但是要注意,当我们在对象环境中使用字符串时,被创建的String对象只不过是瞬时存在的,它使得我们可以访问属性和方法,此后它就没有用了,所以系统会自动丢序它。如上执行(4)时,一个String对象被创建了,它是瞬时存在的,使我们能访问typeof方法,之后它被丢弃。原始的值s并不会改变。
如果想要在程序中显式创建使用String对象,那么需要创建一个非瞬时的对象,即不能自动被系统丢弃的对象。String对象的创建和其他对象一样,都使用new运算来创建:
//(3)
var S = new String("hello world");
需注意的是,创建了String对象S后,除了typeof S返回对象外,其它情况我们基本上无法区分字符串和String对象1)
只需记住:只要有必要,字符串都会被转换成String对象;同时当我们在一处需要字符串值的地方使用String对象时,JS会自动通过调用toString()方法来将其瞬时转化成字符串值。2)
以上讨论同样适用于数字,布尔值及其相应的Number对象,Boolean对象。
额外说明上例代码中:
//(2)
var ns = String("hello world"); // 使用toString也可达到相同目的
String()可以将值显式地转化成字符串。