布尔值

Boolean 值可以是两个值之一:truefalse,表示逻辑命题的真值。

描述

布尔值通常由 关系运算符相等运算符 以及 逻辑非 (!) 生成。它们也可以由表示条件的函数生成,例如 Array.isArray()。请注意,二元逻辑运算符(如 &&||)返回操作数的值,这些值可能是也可能不是布尔值。

布尔值通常用于条件测试,例如 if...elsewhile 语句的条件,条件运算符 (? :),或 Array.prototype.filter() 的谓词返回值。

您很少需要显式地将某些内容转换为布尔值,因为 JavaScript 在布尔上下文中会自动执行此操作,因此您可以根据其 真值 将任何值用作布尔值。您还鼓励在自己的代码中使用 if (condition)if (!condition) 而不是 if (condition === true)if (condition === false),以便您可以利用此约定。但是,确保表示条件的值始终是布尔值可以帮助阐明代码的意图。

js
// Do this:
// This always returns a boolean value
const isObject = (obj) => !!obj && typeof obj === "object";

// Or this:
const isObject = (obj) => Boolean(obj) && typeof obj === "object";

// Or this:
const isObject = (obj) => obj !== null && typeof obj === "object";

// Instead of this:
// This may return falsy values that are not equal to false
const isObject = (obj) => obj && typeof obj === "object";

布尔值基本类型和布尔值对象

要将非布尔值转换为布尔值,请使用 Boolean 作为函数,或使用 双非 运算符。不要将 Boolean() 构造函数与 new 一起使用。

js
const good = Boolean(expression);
const good2 = !!expression;
js
const bad = new Boolean(expression); // don't use this!

这是因为所有对象,包括其包装值为 falseBoolean 对象,在条件语句等地方都是 真值 并评估为 true。(另请参见下面的 布尔值强制转换 部分。)

js
if (new Boolean(true)) {
  console.log("This log is printed.");
}

if (new Boolean(false)) {
  console.log("This log is ALSO printed.");
}

const myFalse = new Boolean(false); // myFalse is a Boolean object (not the primitive value false)
const g = Boolean(myFalse); // g is true
const myString = new String("Hello"); // myString is a String object
const s = Boolean(myString); // s is true

警告:您很少会发现自己使用 Boolean 作为构造函数。

布尔值强制转换

许多期望布尔值的内置操作会首先将其参数强制转换为布尔值。 操作 可以概括如下

  • 布尔值按原样返回。
  • undefined 转换为 false
  • null 转换为 false
  • 0-0NaN 转换为 false;其他数字转换为 true
  • 0n 转换为 false;其他 BigInt 转换为 true
  • 空字符串 "" 转换为 false;其他字符串转换为 true
  • 符号 转换为 true
  • 所有对象都变成 true

注意:一个遗留行为使 document.all 在用作布尔值时返回 false,尽管它是一个对象。此属性是遗留的,并且是非标准的,不应使用。

注意:与其他类型转换(如 字符串强制转换数字强制转换)不同,布尔值强制转换不会尝试通过调用用户方法来 将对象转换为基本类型

换句话说,只有少数几个值会被强制转换为 false——这些值被称为 假值。所有其他值都称为 真值。一个值在逻辑运算符、条件语句或任何布尔上下文中使用时的真值非常重要。

在 JavaScript 中,有两种方法可以达到相同的效果。

  • 双非!!xx 进行两次否定,这将使用与上面相同的算法将 x 转换为布尔值。
  • The Boolean() 函数:Boolean(x) 使用与上面相同的算法来转换 x

请注意,真值与 松散相等truefalse 不同。

js
if ([]) {
  console.log("[] is truthy");
}
if ([] == false) {
  console.log("[] == false");
}
// [] is truthy
// [] == false

[] 是真值,但它也松散相等于 false。它是真值,因为所有对象都是真值。但是,当与 false(一个基本类型)进行比较时,[] 也会转换为基本类型,通过 Array.prototype.toString() 成为 ""。比较字符串和布尔值会导致两者都被 转换为数字,并且它们都变成 0,所以 [] == falsetrue。一般来说,假值和 == false 在以下情况下有所不同

  • NaNundefinednull 是假值,但松散不相等 false
  • "0"(以及其他不是 ""被强制转换为 0 的字符串文字)是真值,但松散相等于 false
  • 对象始终是真值,但它们的基本类型表示可能松散相等于 false

真值不太可能松散相等于 true。所有值要么是真值,要么是假值,但大多数值松散不相等 truefalse

构造函数

Boolean()

创建 Boolean 对象。当作为函数调用时,它返回布尔值类型的基本类型值。

实例属性

这些属性在 Boolean.prototype 上定义,并由所有 Boolean 实例共享。

Boolean.prototype.constructor

创建实例对象的构造函数。对于 Boolean 实例,初始值为 Boolean 构造函数。

实例方法

Boolean.prototype.toString()

返回一个字符串,该字符串根据对象的 value 为 truefalse。覆盖了 Object.prototype.toString() 方法。

Boolean.prototype.valueOf()

返回 Boolean 对象的基本类型值。覆盖了 Object.prototype.valueOf() 方法。

示例

创建假值

js
const bNoParam = Boolean();
const bZero = Boolean(0);
const bNull = Boolean(null);
const bEmptyString = Boolean("");
const bfalse = Boolean(false);

创建真值

js
const btrue = Boolean(true);
const btrueString = Boolean("true");
const bfalseString = Boolean("false");
const bSuLin = Boolean("Su Lin");
const bArrayProto = Boolean([]);
const bObjProto = Boolean({});

规范

规范
ECMAScript 语言规范
# sec-boolean-objects

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅