在 JavaScript 中将值转换为布尔值的 2 种方法

2025-06-10

在 JavaScript 中将值转换为布尔值的 2 种方法

替代文本

我最喜欢使用!!。这也是 Airbnb JavaScript 风格指南推荐的方法 👍

Boolean(value);

!!value;

将值转换为布尔值

细绳

const string = 'string';

!!string; // true
Boolean(string); // true

数字

const number = 100;

!!number; // true
Boolean(number); // true

虚假值

在 JavaScript 中,有 6 个假值。如果你将其中任何一个转换为boolean,它将返回false

false
undefined
null
NaN
0
"" (empty string)

任何不在虚假列表中的内容都将返回true👍

关于这方面的更多信息,你可以阅读我的关于 Falsy Values 的代码注释

示例

应用于!!虚假值

!!false; // false
!!undefined; // false
!!null; // false
!!NaN; // false
!!0; // false
!!''; // false

应用于Boolean虚假值

Boolean(false); // false
Boolean(undefined); // false
Boolean(null); // false
Boolean(NaN); // false
Boolean(0); // false
Boolean(''); // false

!!工作原理

第一个函数!将值强制转换为布尔值,然后对其进行取反。在本例中,!value将返回false。因此,为了将其反转回true,我们需要!在其上添加另一个值。因此使用了 double !!

const value = 'string';

!value; // false

!!value; // true

注意'false'

const value = 'false';

!!value; // true
Boolean(value); // true

注意"false"引号之间的 is '。虽然它写着false,但实际上是一个字符串。我知道你们大多数人不会上当,但如果你像我一样,你可能还是要警惕别人可能在耍的那些脑筋急转弯😂

社区意见

@tassoevan我喜欢像这样从数组中过滤假值:myArray.filter(Boolean)

@fleonus :我喜欢!+!装酷,然后吓唬别人 :P

速度测试

这是我发现的一个测试:

布尔值 vs !!

看起来!!Boolean

使用哪一个?

我收到了很多关于这篇文章的评论。有些人更喜欢这个,Boolean因为它更明确。

但是,You Don't Know JS 的 Kyle Simpson 提到两者都很明确。

// better (works explicitly):
if (!!a) {
}

// also great (works explicitly):
if (Boolean(a)) {
}

凯尔·辛普森:YDKJS——强制

我认为我没有很好的答案。你比我更了解你的团队。我会继续!!在自己的项目中使用,因为它不需要输入太多代码,而且我理解这种语法。但如果我在一个团队中,我可能会选择它,Boolean因为我认为大多数开发人员会更理解它。无论你选择哪一种,最重要的是保持一致。不要在你的代码库中在两者之间摇摆不定。选择一种并坚持下去💪

以下是我收到的一条很棒的评论:

@patrick_developer:我说应该同时了解两者,是为了万一遇到使用不同代码库的情况。知识就是力量。

换句话说,两者并无优劣之分。我认为这更像是一种偏好。所以你不会出错。但不要剥夺自己同时理解两者的机会。就像帕特里克说的,“知识就是力量”💪

避免new Boolean

使用原始类型而不是对象类型

var str = 'str';

// Avoid
typeof new Boolean(str); // object

// Preferred
typeof Boolean(str); // boolean
typeof !!str; // boolean

CJ J .:值得注意的是,new Boolean它不是布尔值,而是布尔值的实例。原始类型更便宜,应该比对象类型更受欢迎。

CJ J.new Boolean(str)返回一个对象类型。Boolean(str)它只返回一个原始布尔值。我怀疑Boolean(str)这样会更快,!!str因为它只需要一个操作,但也完全有可能浏览器会实现某种优化,这样当它们看到时,!!就知道直接将参数转换为布尔原始值(而不是NOT()连续执行两次)。

CJ J .:原始类型很便宜,因为它们是不可变的,所以你可以共享引用,而不必在实例上保存任何状态。它只是……true或者…… false。但new Boolean(str)它是一个对象。它拥有自己唯一的内存地址,并且可以保存其独有的内部状态。这意味着它不能仅仅保存对不可变单例实例的引用。每次调用都会new Boolean(str)实例化一个全新的Boolean()对象。

感谢:CJ J。

使用布尔构造函数删除空字符串

CJ J .:这是一个经典的例子。如果你得到一个用逗号分隔的字符串值列表,并且想要过滤掉空字符串,你可以将布尔构造函数传递给 Array.prototype.filter,它会自动去除零长度字符串,只留下一个有效字符串的数组。

var str = 'some,list,,of,values';
var arr = str.split(',');

arr; // [ 'some', 'list', '', 'of', 'values' ]

arr.filter(Boolean); // [ 'some', 'list', 'of', 'values' ]

感谢:CJ J。

资源


感谢阅读❤
打个招呼!Instagram | Twitter |博客| SamanthaMing.com

鏂囩珷鏉ユ簮锛�https://dev.to/samanthaming/2-ways-to-convert-values-to-boolean-in-javascript-3a3a
PREV
在 JavaScript 中设置默认值的 3 种方法
NEXT
JavaScript:何时应该使用 forEach 和 map?