ECMAScript 的原始值包装类型——Boolean讲解

788 阅读3分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

ECMAScript 提供了 3 中特殊的引用类型:BooleanNumberString,方便操作原始值。我们先来看一个例子:

let my = "Sam";
let you = my.substring(2)

console.log(you); // "m"

这里创建了一个原始值字符串 my,紧接着调用substring()方法,并将结果保存至 you 中。但原始值并不是对象,substring 方法是从哪来的? 实际上是因为后台做了处理,从而实现了上述操作,具体来说,当第二行访问 my 的时候,是以只读模式访问的,后台会执行以下三个步骤: 1、创建一个 String 类型的实例 2、调用实例上的特定方法 3、销毁实例 相当于执行了以下代码:

let my = new String("Sam");
let you = my.substring(2);
my = null;

对于 Boolean 和 Number 也一样,以上三步也会在后台执行,只不过使用的是 Boolean 和 Number 的包装类型。

Boolean

Boolean 是对应布尔值的引用类型。要创建一个Boolean对象,就使用Boolean构造函数并传入true 或 false,如下例所示:

let booleanObject = new Boolean(true);

Boolean 的实例会重写 valueOf() 方法,返回一个原始值 true 或 false。toString()方法被调用时也会被覆盖,返回字符串"true"或"false"。不过,Boolean 对象在 ECMAScript 中用得很少。不仅如此,它们还容易引起误会,尤其是在布尔表达式中使用Boolean对象时,比如:

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

let falseValue = false;
result = falseValue && true;
console.log(result); // false

在这段代码中,我们创建一个值为 false 的 Boolean对象。然后,在一个布尔表达式中通过 && 操作将这个对象与一个原始值true组合起来。在布尔算术中,false && true 等于 false。可是,这个表达式是对 falseObject 对象而不是对它表示的值(false)求值。前面刚刚说过,所有对象在布尔表达式中都会自动转换为 true,因此falseObject在这个表达式里实际上表示一个 true 值。那么 true && true 当然是 true。 除此之外,原始值和引用值(Boolean对象)还有几个区别。首先,typeof操作符对原始值返回"boolean",但对引用值返回"object"。同样,Boolean 对象是 Boolean类型的实例,在使用instaceof操作符时返回true,但对原始值则返回false,示例:

console.log(typeof falseObject);             // object
console.log(typeof falseValue);              // boolea
nconsole.log(falseObject instanceof Boolean); // true
console.log(falseValue instanceof Boolean);  // false

理解原始布尔值和Boolean对象之间的区别非常重要,强烈建议永远不要使用后者。

写在最后

写作不易,希望可以获得你的一个「赞」。如果文章对你有用,可以选择「收藏」。 如有文章有错误或建议,欢迎评论指正,谢谢你。❤️

欢迎阅读其它文章