在 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
速度测试
这是我发现的一个测试:
看起来!!
比Boolean
使用哪一个?
我收到了很多关于这篇文章的评论。有些人更喜欢这个,Boolean
因为它更明确。
但是,You Don't Know JS 的 Kyle Simpson 提到两者都很明确。
// better (works explicitly):
if (!!a) {
}
// also great (works explicitly):
if (Boolean(a)) {
}
我认为我没有很好的答案。你比我更了解你的团队。我会继续!!
在自己的项目中使用,因为它不需要输入太多代码,而且我理解这种语法。但如果我在一个团队中,我可能会选择它,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。
资源
- Scotch.io:逻辑非运算符
- Stack Overflow:什么是非非运算符
- Airbnb JavaScript 风格指南
- Javascript 中 new Boolean() 的用途是什么?
- 双重否定!!x
- 你不知道的 JS:强制转换
- 最初发表于 www.samanthaming.com
感谢阅读❤
打个招呼!Instagram | Twitter |博客| SamanthaMing.com