为了便于操作基本类型的值,ECMAScript提供了三个特殊的引用类型:Boolean,Number,String
一,基本包装类型与引用类型的主要区别
每当读取一个基本类型的值时,后台就会创建一个对应的基本包装类型的对象,从而能够让我们调用一些方法来操作这些数据。
在读取模式中访问字符串时后台都会自动完成下列处理(Number和Boolean处理相同):
(1)创建String类型的一个实列
(2)在实列上调用指定的方法
(3)销毁这个实例
可以将上面三个步骤想象成是执行了下列ECMAScript代码:
var str1 = new String("some text");
var str2 = str1.substring(2);
str1 = null;
综上就知基本包装类型与引用类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象则只存在于一行代码的执行瞬间,然后立即销毁。也就意味着不能在运行时为基本类型值添加属性和方法。
二,new Number()与Number()的区别
使用new操作符调用基本包装类型的构造函数与直接调用同名的转型函数是不一样的,从下面就可得知(Boolean和String相同):
var value = "10";
var number = Number(value);//转型函数
alert(typeof(number));//“number”
var obj = new Number(value);//构造函数
alert(typeof(obj));//"object"
/*其中变量number保存的是基本包装类型的值10,而变量obj保存的是Number的实例*/
三,Boolean类型
var falseObject = new Boolean(false);
var result = falseObject && true;
alert(result);//true
var falseValue = false;
result = falseValue && true;
alert(result);//false
解析:上面代码中使用false创建了一个Boolean对象,然后这个对象与基本类型值true构成了逻辑与表达式。在布尔运算中false&&true等于false,但是代码中的结果时true,这是因为Boolean构造函数这行代码是对falseObject而不是它的值(false)进行求值。需要注意的是布尔表达式中的所有对象都会被转化成true,因此falseObject对象在布尔表达式中代表的是true,所以最后就是true&&true结果就是true。
基本类型与引用类型的布尔值也是有很大区别的,从下面代码就可以看出:
var falseObject = new Boolean(false);//此处falseObject作为Boolean的实例
var result = falseObject && true;
alert(result);//true
var falseValue = false;//此处falseValue是一个基本类型值
result = falseValue && true;
alert(result);//false
console.log(typeof falseObject);//object
console.log(typeof falseValue);//boolean
console.log(falseObject instanceof Boolean);//true
console.log(falseValue instanceof Boolean);//false
/*建议不要使用Boolean对象*/
String类型在另一篇博客中详细介绍