JS提供了11种引用类型:Object、Array、Date、Function、Error、RegExp、Math、Number、String、Boolean、Globle。其中包括了三种基本包装类型,也就是Number、String和Boolean,它们是特殊的引用类型,既与其余的引用类型类似,同时又具备与各自的原始类型相应的特殊行为。浏览器
1、什么是包装类型?对象
由于这字符串、数值、布尔三种原始类型的值,在必定条件下会自动转化为对象,所以被称为原始类型的“包装类型”。内存
例如:var a1="some text";作用域
var a2=a1.substring(0,2);字符串
console.log(a2);//"so"string
上面这个例子中,变量a1是一个字符串,字符创必然是基本类型的值,可是它却在第二行调用了substring()方法,并将结果返回保存在a2中,咱们都知道,既然a1是基本类型的值而不是对象,于是从逻辑上讲,它是没有方法的。其实在在实现这个操做的时候,JS内部已经隐式地帮咱们帮建立了一个包装对象了,以上的实际的情形应该是这样的:io
var a1=new String("some text");console
var a2=a1.substring(0,2);test
a1=null; 变量
console.log(a2);//"so"
可是这两种方式仍是有区别的:
区别一:浏览器本身隐式建立的包装对象和你显式建立的包装对象不严格相等。
var a1="test";
var a2=new String("test");
console.log(a1==a2);//true
console.log(a1===a2);//false
区别2:隐式建立的包装对象,在使用完后以后就会被销毁了。例如:
var s1="some text";
var s1.color="red";
console.log(s1.color);//undefined
上面的代码,在第二行代码试图为一个字符s1添加一个color属性,可是当第三行再次访问的时候,color属性已经不见了。缘由就是第二行代码建立的String对象在执行第三行代码时已经被销毁了,第三行代码又建立来了本身的String对象,但是没有了color属性,因此最终返回的值是undefined。
在实际运用中,咱们能够显式的调用String、Number和Boolean来建立基本包装类型的对象,不过,应该在绝对必要的时候再这么作,由于这种作法很容易让人分不清本身是在处理基本类型仍是引用类型。对基本包装类型的实例调用 typeof 会返回object。
2、包装类型和引用类型的区别
引用类型和包装类型的主要区别是对象的生存期。使用new操做符建立的引用类型的实例,在执行流离开当前做用域以前都一直保存在内存中。而自动穿件的基本包转类型的对象,则只存在于一行代码的执行期间,而后当即被销毁,这也意味着咱们不能在运行时为基本类型添加属性和方法。