在js中为了方便我们这些苦逼的程序员操作基本类型值,ECMAScript提供了三种特殊的引用类型---基本包装类型(我们也叫包装对象):Boolean、String和Number。一眼看到这三个家伙是不是就想到与他们对应的三个基本类型呢?我告诉大家,这三个家伙与其他引用类型有相似之处,并且也具有各自所对应的基本类型的特殊行为。
在上面我们说着三个特殊的引用类型与其他引用类型有相似之处,不知你是否已经知道答案了,那就是这三个特殊的引用类型也可以使用它们各自的方法。咦?在我们印象中基本数据类型不是对象,不是应该不能使用方法吗?我可以说是js可怜我们这些苦逼的程序员给我们提供便利,让我们可以更方便的操作基本类型值吗?
其实为了为了我们这么方便的操作,你可以想象js做了以下处理:
var s1 = new String("hello"); // 创建一个String类型的实例
var s2 = s1.subString(2); // 调用实例的指定方法
s1 = null; // 销毁这个实例
有没有好奇怎么会有"s1 = null;"这个操作呢,其实这就体现了引用类型与基本包装类型的主要区别了。
引用类型与基本包装类型的主要区别就是对象的生存期。
- 使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存到内存中。
- 自动创建的基本包装类型的对象,则只存在于一行代码执行的瞬间,然后就被销毁了。这也就说明我们不能在运行的时候不能为基本属性和方法。
让我们来验证一下上面所说的,大家来看下面的这个例子:
var s1 = "red";
s1.color = "blue"; // 为s1添加color属性
console.log(s1.color); // undefined
在上面这个例子中,在第二行代码中我们为s1添加了color属性,但是当代码执行到第三行时,我们惊奇的发现我们刚添加的color属性不见了,其实就是第二行创建的String对象在执行第三行代码时已经被销毁了。
那接下来就进入我们正题的第一个主题:Boolean类型
Boolean类型是与布尔值对应的引用类型。要创建Boolean对象非常简单,只需调用Boolean构造函数并传入true或false值。
我们来看下下面的实例:
var booleanObject = new Boolean(true); // 创建Boolean对象并传入ture
但我们发现一个Boolean对象造成一个非常不好的问题,让我们来看看它到底干了啥错事。
var booleanObject = new Boolean(false); // 创建Boolean对象并传入flase
var result = booleanObject && true;
//惊奇的事情就要发生了
console.log(result); // true
WHAT?这到底发生了什么,说好的false,瞬间怀疑学了假的js,但是事实就是返回了ture。其实在js中布尔表达式中的所有对象都会被转换成true,所以在上面例子中原本存储着false的booleanObject被转换成了true,所以自然而然返回的结果是true了。
所以小编建议不要不要不要使用Boolean对象!!!
//而假若我们使用基本类型的布尔值呢?
var falseValue = false;
var result = falseValue && true;
console.log(result); // 这时大家肯定知道返回的是false了
除此之外我们还要知道Boolean类型跟我们基本类型的布尔值的的其他区别。话不多说,直接上例子。
// 继续使用上面例子中的变量
console.log(typeof booleanObject); // object
console.log(typeof falseValue); // boolean
console.log(booleanObject instanceof Boolean); // true
console.log(falseValue instanceof Boolean); // false
或许有人会疑惑typeof 跟instanceof 之间的区别,小编会在下篇讲述Number类型中说说我的理解。还是有没有好心的小伙伴来透露一下。