一篇文章让你玩转js中的Boolean

前言

这篇文章带大家来回顾一下,基本类型布尔型和为什么布尔类型是基本数据类型却可以调用一些属性和方法,本文主要参考了《JavaScript高级程序设计》,如有不对之处欢迎指正

正文

基本数据类型Boolean

Boolean类型是ECMAScript中使用得最多的一种类型,该类型只有两个字面值:true和false。且这两个字面量值不一定等于数字中的1或0,Boolean类型的字面值true和false是区分大小写的。也就是说,True和False(以及其他的混合大小写形式)都不是Boolean值,只是标识符。

ES中所有的数据类型都有与Boolean类型等价的值,要看他们等价于true还是false,可以调用转型函数Boolean(),注意这个函数任何数据类型都可以使用,下面是转换规则:

数据类型 可以转换为true的值 可以转换为false的值
Boolean true false
String 非空字符串 空字符串
Number 任何非零数字(包括无穷大) 0和NaN
Object 任何对象(请牢记,下面会提到) null
undefined 不适用 undefined
与基本数据类型对应的基本包装类型对象

讲到这里,我要在引申一下即基本数据类型Boolean对应的基本包装类型对象Boolean,其中还有(String,Number),正是有了这些基本包装类型的对象,我们才能在Number,String这些基本数据类型上使用一些属性和方法(基本类型值不是对象,因而从逻辑上讲它们不应该有方法),每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。

每当读取一个基本数据类型时,后台都会自动完成下列处理。

(1) 创建String类型的一个实例;

(2) 在实例上调用指定的方法;

(3) 销毁这个实例。

例如:

var s1 = "some text";
var s2 = s1.substring(2);

在后台实际经历了如下步骤:

var s1 = new String('some text');
var s2 = s1.substring(2);
s1 = null;

引用类型与基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码的执行瞬间,然后立即被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法。

当然,可以显式地调用Boolean、Number和String来创建基本包装类型的对象。不过,应该在绝对必要的情况下再这样做,因为这种做法很容易让人分不清自己是在处理基本类型还是引用类型的值。对基本包装类型的实例调用typeof会返回"object",而且所有基本包装类型的对象在转换为布尔类型时值都是true。(对应表中的转换规则)。

Object构造函数也会像工厂方法一样,根据传入值的类型返回相应基本包装类型的实例。

var a = new Object('string'); // a会是一个Sting的实例
var b = new Object(2); // 会是一个Number的实例
var b = new Object(true); // 会是一个Boolean的实例
Boolean基本包装数据类型

Boolean对象在ECMAScript中的用处不大,因为它经常会造成人们的误解。其中最常见的问题就是在布尔表达式中使用Boolean对象,但是理解基本类型的布尔值与Boolean对象之间的区别非常重要,看下面的例子

 var falseObject = new Boolean(false);
 var result = falseObject && true;
 console.log(result); //true
var falseValue = false;
result = falseValue && true;
console.log(result); // false

我们使用false值创建了一个Boolean对象。然后,将这个对象与基本类型值true构成了逻辑与表达式。在布尔运算中,false && true等于false。可是,示例中的这行代码是对falseObject而不是对它的值(false)进行求值。前面讨论过,布尔表达式中的所有对象都会被转换为true,因此falseObject对象在布尔表达式中代表的是true。结果,true && true当然就等于true了。

基本类型与引用类型的布尔值还有两个区别。首先,typeof操作符对基本类型返回"boolean",而对引用类型返回"object"。其次,由于Boolean对象是Boolean类型的实例,所以使用instanceof操作符测试Boolean对象会返回true,而测试基本类型的布尔值则返回false。

原文地址:https://www.cnblogs.com/jojo-star/p/13446501.html