本文转载自公众号 "读芯术"(ID:AI_Discovery)
JavaScript 中如何将数值转换为 Boolean? 这篇文章帮你搞定! 往下看吧~
字符串
- conststring = 'string';!!string; // true
- Boolean(string); // true
数值
- constnumber = 100;!!number; // true
- Boolean(number); // true
虚值
在 JavaScript 中, 有 6 个虚值. 如果将其中任何一个字符串转换为 Boolean, 它将变为 false .
- false
- undefined
- null
- NaN
- 0
- "" (empty string)
任何不为虚值的都会转换为 true.
示例
虚值的应用:
- !!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
当心'false'
- constvalue = 'false';!!value; // true
- Boolean(value); // true
注意 "false" 必须写在引号之间. 虽然是虚值, 但实际上是一个字符串. 大多数人都不会在这里中圈套, 但还是需要随时保持警惕.
图源: digilentin
如何操作该代码
首先! 将该值强制转换为 Boolean 并取反. 在上下文中, !value 将变回虚值. 所以为了将 value 恢复成真值, 将另一个 "!" 放入操作中, 因此这里出现了两个!.
const value = 'string';!value; //false!!value; // true
速度测试
boolean vs !!
看起来像 !! 但测试速度比 Boolean 快.
图源: unsplash
有些人更喜欢 Boolean, 因为它更明确. 但是, KyleSimpson 在《你不知道的 JavaScript》中提到, 这两者都是明确的.
- //better (works explicitly):
- if (!!a) {
- }// also great (works explicitly):
- if (Boolean(a)) {
- }
这里不会给你标准答案, 你可以按需选择. 笔者会在个人开发的项目中继续使用!!, 其键入较少而且笔者对这种语法有了解.
反之, 如果是作为团队考虑, 笔者可能会选择 Boolean. 大多数开发人员都能更好地理解这一点. 无论选择哪一个, 最重要的是保持代码一致, 不要换来换去, 选择一种并坚持下去.
这更像是一种偏好选择, 不要剥夺自己理解两种代码的权利.
避免 newBoolean
使用基元而不是对象类型
- var str = 'str';// Avoid
- typeof new Boolean(str); // object// Preferred
- typeof Boolean(str); // boolean
- typeof !!str; // boolean
值得注意的是, new Boolean 不是 boolean, 而是布尔值的示例. 基元比较廉价, 相比对象类型应优先使用.
new Boolean(str) 可以返回对象类型. Boolean(str)只返回 boolean 的原始值. 笔者猜测 Boolean(str)比!!str 更快. 因为这只是一项操作, 但是浏览器也有可能实施优化, 以便程序员看到 !! 他们知道直接将参数转换为 boolean 原始值 (而不是实际执行 NOT() 连续两次).
基元很便宜, 它们是不可变的, 因此可以共享引用, 而不必在实例上保留任何状态. 要么 true 要么 false.
但 newBoolean(str)是一个对象. 它有自己的唯一存储地址, 并且可以保存唯一的内部状态. 这意味着它不能只保存对不可变单例实例的引用. 每次运行 new Boolean(str) 实例化都会产生一个全新的 Boolean()对象.
使用 Boolean 构造函数删除空字符串
CJJ.: 这是经典示例. 如果得到一个用逗号分隔的字符串值列表, 并且想要过滤掉空字符串, 则可以将 Boolean 构造函数传递给 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' ]
你学会了吗?
来源: http://developer.51cto.com/art/202004/613880.htm