最近在看《JavaScript高级程序设计》一书,顺手做做笔记。
已知JS中,String,Boolean,Number是属于基本类型,即它们都不是对象。然而,在使用JS中,会经常用到它们的方法,如
var str = "string";
var ret = str.substr(1);
这时候就有疑惑了,变量str不是Object类型,哪里来的方法呢?
因为String,Boolean,Number它们三个除了是基本类型之外,还有另外一个身份:特殊的引用类型----基本包装类型。
基本包装类型是什么?
基本包装类型是指基本类型String,Boolean,Number在后台运行时的一种特殊形态。
我觉得用代码来解释会比较简洁。
var str = "test";
var str1 = str.substr(1); //当代码执行到这里时,在后台创建了一个String类型的对象,然后调用这个对象的substr方法。当方法调用完后,就马上销毁对象了,重要的事情说三遍:当方法调用完后,就马上销毁对象了!当方法调用完后,就马上销毁对象了!当方法调用完后,就马上销毁对象了!
看到这里,很多人应该以为基本包装类型可以和引用类型一样使用了吧。然而,它们之间还是有一定差别的。
基本包装类型和引用类型的主要区别,在于对象的生存周期。基本包装类型中的对象就像夜空中的流星,来不及许愿,就没了(该行代码执行完后就被销毁了)。而引用类型中的对象,在执行流离开当前作用域之前会一直保存在内存中。
所以 :
var str = "test";
str.name = "wang";
alert(str.name); //输出的是undefined,str中的“对象”来到这里已经消失了,执行alert(str.name)时创建了新的String对象,而该对象中没用name这个属性。