JS中Boolean 的妙用

news/2025/2/6 14:05:42/

显示转换与隐式转换

为了加深对Boolean的语法理解,我们先回忆一下JavaScript中的显示与隐私转换

显示转换

显示转换是指通过明确的代码,主动江一中数据类型转换为另一种类型,这种方式通常是直观的,可控的。
常见方法:

  • 使用构造函数:String(),Number(),Boolean()等
  • 使用特定方法:如toString(),parseInt()等
javascript">// 转换为字符串
const num = 42;
const str = String(num);      // "42"
const str2 = num.toString();  // "42"// 转换为数字
const strNum = "123";
const num2 = Number(strNum);  // 123// 转换为布尔值
const val = 0;
const bool = Boolean(val);    // false

隐式转换

在JavaScript中,所有的值都可以被隐式转换为布尔值,在这种转换中,值会被分类为“真值”或“假值”。
假值(falsy):在转换为布尔值时被视为false的值,包括:

  • false
  • 0 (数字零)
  • -0 (负零)
  • “”(空字符串)
  • null
  • undefined
  • NaN (非数字)
    真值(truthy):除了上述假值外,所有其他值在转换为布尔值时都会被视为true。
    在条件判断if和逻辑运算中,所有的值都会被进行隐式转换,如:
javascript">// if中的0被视为false
if(0){}
// if中的1被视为true(1是真值)
if(1){}

Boolean 的妙用

Boolean构造函数是JavaScript中的内建函数之一,用于将一个值转换为布尔值(true或false)。在前端开发中,Boolean 的用途似乎并不多,在进行一些布尔判断时,我们几乎都使用了隐式转换。

javascript">const data = res?.data || []if(data?.length){// ....
}

上述代码中,data?.length就会被隐式转换为布尔值,从而达到我们的预期功能
很少会有人会显示转换

javascript">const data = res?.data || []if(Boolean(data?.length)){// ....
}

这么一看,Boolean的使用场景似乎都可以被隐式转换替代
下面介绍一种清晰的写法

javascript">const rawlist = res?.data || []const trueList = values.filter(Boolean);

虽然,我没理解这样为啥生效,但我很明白这个段代码的含义是通过filter方法过滤掉了原始数组中的所有假值,如null、undefined、“”、0等。

filter(Boolean)的奥秘

其实,filter(Boolean)生效的原因非常简单,因为Boolean本身就是js中的一个构造函数,我们可以将它理解为下面的伪代码

javascript">function Boolean(value) {// 布尔转换规则:Falsy 值返回 false,其它值返回 trueif (value === false || value === 0 || value === "" || value === null || value === undefined || value === NaN) {return false; } else {return true;  }
}// 或function Boolean(value) {return value ? true : false; // 使用三元运算符模拟
}

显然,values.filter(Boolean)的语法就等价于下面的语法:

javascript">const trueList = values.filter(item => Boolean(item));

可见,filter(Boolean)的写法可以方便的过滤到数组中的所有假值!这确实是一个非常优雅的写法!

Boolean的其他使用场景

Boolean 作为 JavaScript 的一个内置构造函数,可以作为一个简单的类型转换工具,在ts中,借助Boolean可以将某个值转换为布尔类型,从而避免一些类型报错。

如,如果用户输入了某个值,我们显示某个组件

javascript"><div class="count-info"><span v-if="inputValue">{{ "输入的值为:" + inputValue }}</span><input v-model="inputValue">
</div>
<script setup lang="ts">const inputValue = ref<string>("")
</script>   

在ts中,编译器会给我们提示警告:v-if后面需要跟一个布尔值,但inputValue是string类型。

此时,我们用Boolean转换inputValue就可以完美解决这个问题

javascript"><div class="count-info"><span v-if="Boolean(inputValue)">{{ "输入的值为:" + inputValue }}</span><input v-model="inputValue">
</div>
<script setup lang="ts">const inputValue = ref<string>("")
</script>   

当然,有些人喜欢花里花哨,使用!!强制转换

javascript"><div class="count-info"><span v-if="!!inputValue">{{ "输入的值为:" + inputValue }}</span><input v-model="inputValue">
</div>
<script setup lang="ts">const inputValue = ref<string>("")
</script>   

http://www.ppmy.cn/news/1569820.html

相关文章

C语言勘破之路-最终篇 —— 预处理(上)

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 一、预定义符号二、#define定义常量三.、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏和函数的对比1.宏的优势2.函数的优…

为AI聊天工具添加一个知识系统 之87 详细设计之28 Derivation 统一建模元模型 之1

文本要点 要点 Derivation 统一建模元模型 Derivation 统一建模元模型&#xff1a;意识原型的祖传代码&#xff0c;即支撑 程序框架的 符号学中的 自然和逻辑树。 这棵树的雏形中描述了三种建模工件&#xff1a;语用钩子&#xff0c;语法糖和语义胶水。 三种工件对应的三“…

[免费]基于Python的Django博客系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的Django博客系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展&#xff0c;信息的传播与…

Vim 多窗口编辑及文件对比

水平分割 :split 默认使用水平分割的方式。 :split :sp 垂直分割 :vsplit :vs 带文件的分割 :split 文件名 :sp 文件名 在光标所在的窗口&#xff0c;输入分割窗口命令就会对那个窗口进行分割。 切换窗口 Ctrlw 切换正在编辑的窗口 快速分割窗口 Ctrlwn 快速分割当前…

使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025

使用SpringBoot发送邮件 文章目录 使用SpringBoot发送邮件1. 获取网易邮箱服务的授权码2. 初始化项目maven部分web部分 3. 发送邮件填写配置EmailSendService [已解决]部署时连接超时附&#xff1a;Docker脚本Dockerfile创建镜像启动容器 1. 获取网易邮箱服务的授权码 温馨提示…

基于STM32的除湿杀菌鞋柜设计

&#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是加湿器。设备的详细功能见网盘中的文章《13、基于STM32的除湿杀菌鞋柜设计》&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1uWSZX2zbZwy9sYwwnvyktQ?pwd5132 提取码…

为AI聊天工具添加一个知识系统 之82 详细设计之23 符号逻辑 正则表达式规则 之1

本文要点 在继续“逻辑符号”的设计中&#xff0c;我们先回顾一个本项目--作为备忘也作为 设计中的时刻牢记&#xff1a; 回顾 项目介绍 项目名&#xff1a;为使用AI聊天工具的聊天者开挂一个知识系统项目口号&#xff1a;通过不断完善一个概念整体运营的大局观思想来持续维…

基于微信小程序的私家车位共享系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…