javascript —— ! 和 !! 的区别与作用
javascript —— ! 和 !! 的区别与作用
在 JavaScript 里,! 和 !! 是两种不同的逻辑运算符,它们的功能和使用场景有明显区别。
1、 !(逻辑非运算符)
它的主要作用是 对操作数进行布尔值取反
。具体来说,就是 先把操作数转换为布尔值,然后取其相反的值
。
代码示例:
console.log(!true); // false
console.log(!false); // true// 对于非布尔值,会先将其转换为布尔值再取反
console.log(!0); // true(因为 0 转换为布尔值是 false)
console.log(!''); // true(空字符串转换为布尔值是 false)
console.log(!null); // true
console.log(!undefined);// true
console.log(!NaN); // trueconsole.log(!5); // false(因为 5 转换为布尔值是 true)
console.log(!'hello'); // false(非空字符串转换为布尔值是 true)
console.log(![]); // false(空数组是对象,转换为布尔值是 true)
console.log(!{}); // false(空对象转换为布尔值是 true)
2、!!(双重逻辑非运算符)
它其实就是连续使用两次 ! 运算符。先通过第一个 ! 对操作数取反,再用第二个 ! 对取反后的结果再次取反
,最终得到的是操作数对应的布尔值。
console.log(!!true); // true
console.log(!!false); // false// 对于非布尔值,会将其转换为对应的布尔值
console.log(!!0); // false
console.log(!!''); // false
console.log(!!null); // false
console.log(!!undefined);// false
console.log(!!NaN); // falseconsole.log(!!5); // true
console.log(!!'hello'); // true
console.log(!![]); // true
console.log(!!{}); // true
3、 核心区别
- !:能将任何值转换为布尔值,并且结果与该值本身的布尔值相反。
- !!:同样可以把任何值转换为布尔值,但结果和该值本身的布尔值相同。其本质和 Boolean() 函数的作用一样。
4、使用场景
- !:用于条件判断中取反
const value = null;
if (!value) {console.log('值为假值(false)');
}
- !!:用于将一个值强制转换为布尔类型,在需要布尔值的场景中经常会用到。
const value = 'hello';
const isTruthy = !!value; // true
console.log(`值是否为真值:${isTruthy}`);
5、在 vue 项目中的使用
(1)!(逻辑非运算符)在 vue 中的使用
模板中的条件判断
在模板里进行条件渲染时,! 可以对数据进行取反操作。
<template><div><!-- 如果 isLoading 为 false,则显示内容 --><div v-if="!isLoading">内容已加载</div><!-- 如果 user 为空,则显示提示 --><div v-if="!user">请先登录</div></div>
</template>
计算属性中返回取反结果
在计算属性里,! 能够返回取反后的布尔值。
<template><div><button :disabled="isDisabled">提交</button></div>
</template><script>
export default {computed: {isDisabled() {// 当表单无效时禁用按钮return !this.formIsValid;}}
}
</script>
(2)!!(双重逻辑非运算符)
强制转换为布尔值
在模板表达式或者计算属性中,!! 能把值强制转换为布尔值,这在需要布尔值的场景中很有用。
<template><div><!-- 将 message 转换为布尔值,判断是否显示消息提示 --><Alert v-if="!!message" :type="messageType">{{ message }}</Alert><!-- 显示数据是否存在的状态 --><span>{{ !!user ? '已登录' : '未登录' }}</span></div>
</template>
监听事件时处理参数
在监听事件并处理参数时,!! 可将参数转换为布尔值。
<template><div><input type="checkbox" @change="handleChange"></div>
</template><script>
export default {methods: {handleChange(event) {// 将事件的选中状态转换为布尔值const isChecked = !!event.target.checked;this.updateStatus(isChecked);}}
}
</script>
(3)Vue 特有的注意事项
在 v-bind 中使用
在使用 v-bind 绑定布尔属性时,!! 可以确保传入的值是布尔类型。
<template><div><!-- 确保 loading 是布尔值 --><Spinner :loading="!!loadingState" /></div>
</template>
(4)对比示例
<template><div class="user-profile"><!-- 使用 ! 进行条件判断 --><div v-if="!user"><button @click="login">登录</button></div><!-- 使用 !! 强制转换为布尔值 --><div v-if="!!user"><img :src="user.avatar" alt="用户头像"><h3>{{ user.name }}</h3><!-- 在计算属性中使用 ! --><button :disabled="!canEdit">编辑资料</button></div></div>
</template><script>
export default {data() {return {user: null, // 假设这是从 API 获取的用户数据canEdit: true}},methods: {login() {// 登录逻辑...}},computed: {// 使用 !! 将值转换为布尔值hasAvatar() {return !!this.user?.avatar;}}
}
</script>
6、总结
- ! 是取反操作,得到的结果是布尔值,且与原值的布尔值相反。
- !! 是强制类型转换,得到的结果也是布尔值,和原值的布尔值相同。
相关文章:
javascript —— ! 和 !! 的区别与作用
javascript —— ! 和 !! 的区别与作用 在 JavaScript 里,! 和 !! 是两种不同的逻辑运算符,它们的功能和使用场景有明显区别。 1、 !(逻辑非运算符) 它的主要作用是 对操作数进行布尔值取反。具体来说,就是 先把操作…...
鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集
ArkUI 组件速查表 鸿蒙应用开发页面上需要实现的 UI 功能组件如果在这 100 多个组件里都找不到,那就需要组合造轮子了 使用技巧:先判断需要实现的组件大方向,比如“选择”、“文本”、“信息”等,或者是某种形状比如“块”、“图…...
LLM笔记(三)位置编码(1)
位置编码理论与应用 1. 位置编码如何解决置换不变性及其数学表现 在Transformer模型中,自注意力机制(Self-Attention)具有置换不变性(permutation invariance),这意味着对输入序列的词元(toke…...
麒麟v10 部署 MySQL 5.6.10 完整步骤
需要包的私信我 一、安装依赖(Perl环境) # 在线安装依赖 yum -y install perl perl-devel# 离线安装(需提前下载好rpm包) mkdir /data/ybn/soft/pre yum install --downloadonly --downloaddir/data/ybn/soft/pre perl perl-dev…...

Git-学习笔记(粗略版)
前言 很多人都听过git,github这些名词,但是它们是什么,怎么使用?git和github是一个东西吗?本文将详细解答这些问题,彻底弄懂git。 1.Git是啥❓ 有一天,我们的插画师小王接到一个绘画订单,但奈…...

专项智能练习(定义判断)
1. 单选题 热传导是介质内无宏观运动时的传热现象,其在固体、液体和气体中均可发生。但严格而言,只有在固体中才是纯粹的热传导,在流体(泛指液体和气体)中又是另外一种情况,流体即使处于静止状态ÿ…...
失控的产品
大部分程序员很难有机会做一个新的产品,绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会,从2023年开始做,中间经历了许多磕磕碰碰。 有的小伙伴从中离开,偶尔又加入1~2个人,但…...

【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error
Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考:https://www.bilibili.com/opus/977469285985157129 A9 - A11(iPhone6s-X):iOS15.0-16.6.1 A12-A14(iPhoneXR-12PM…...
无线定位之 二 SX1302 网关源码 thread_down 线程详解
前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

对心理幸福感含义的探索 | 幸福就是一切吗?
注:机翻,未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗?对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …...
多平台图标设计与管理的终极解决方案
IconWorkshop Pro 是一款由Axialis团队开发的专业图标设计与制作软件,专注于为设计师、开发者及企业用户提供高效且灵活的图标创作解决方案。该软件凭借其强大的功能与跨平台适配性,成为Windows、macOS、iOS、Android等多系统图标设计的首选工具之一。 …...
ngx_http_keyval_module动态键值管理
一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module,说明模块已编译进 NGINX。 若未找到,请联系你的 NGINX 供应商,获取商业版或重新编译并启用该模块&am…...

【高频面试题】LRU缓存
文章目录 1 相关前置知识(OS)2 面试题 16.25. LRU 缓存2.1 题面2.2 示例2.3 解法1 (双端队列哈希表)思路 2.4 解法2思路 3 参考 1 相关前置知识(OS) 为什么需要页面置换算法:当进程运行时&…...

讯联云库项目开发日志(二)AOP参数拦截
目录 利用AOP实现参数拦截: 一、HTTP请求进入Controller(发送邮件验证码) 二、AOP切面触发 1. 切面拦截(GlobalOperactionAspect.class) method.getAnnotation() null interceptor 判断 2.参数校验注解 3. 参…...

龙虎榜——20250515
上证指数缩量收阴线,个股跌多涨少,上涨波段4月9日以来已有24个交易日,时间周期上处于上涨末端,注意风险。 深证指数缩量收阴线,日线上涨结束的概率在增大,注意风险。 2025年5月15日龙虎榜行业方向分析 一…...
知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑
1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法,搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命:在电商场景中,传统的「关键词匹配」已无法满足个性化购物需求,MOE搜索等新一代架构开始融合知识图谱…...
python-修改图片背景色
在Python中,可以使用图像处理库(如OpenCV或Pillow)来修改图片的背景色。通常,修改背景色的流程包括以下步骤: 1、对图片进行分割,识别前景和背景。 2、对背景区域进行颜色替换。 下面是两种实现方法&#x…...

卡洛诗,将高端西餐的冗余价值转化为普惠体验
西餐市场正经历一场结构性变革,一二线城市的高端西餐陷入内卷,而下沉市场却因品质与价格断层陷入选择困境——消费者既不愿为高价西餐的面子溢价买单,又难以忍受快餐式西餐的粗糙体验。这一矛盾催生了万亿级的市场真空地带,萨莉亚…...
【ROS2】ROS节点启动崩溃:rclcpp::exceptions::RCLInvalidArgument
1、问题描述 启动ROS节点时,直接崩溃,打印信息如下: terminate called after throwing an instance of rclcpp::exceptions::RCLInvalidArgumentwhat(): failed to create guard condition: context argument is null, at ./src/rcl/guard_condition.c:65 [ros2run]: Abo…...

Flutter在键盘的上方加一个完成按钮
有些情况下,输入框在输入键盘弹出后, 需要在键盘的上方显示一个toolbar , 然后 toolbar 上面一个完成按钮,点完成按钮把键盘关闭。 如图: 直接上代码,这样写的好处是,把 TextField 给封装了&…...

SQL注入---05--跨站注入
1 权限说明 select * from mysql.user; 这里的Y表示我前面的命令权限为root,n表示不支持root权限 导致结果: 如果为root的话,我就可操作这些命令并且可以进行跨数据库攻击,但是如果不是高权限root就无法执行这些操作 2 root权限…...
Vue 学习随笔系列二十三 -- el-date-picker 组件
el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…...

【免费分享】虚拟机VM(适用于 Windows)17.6.3
—————【下 载 地 址】——————— 【本章下载一】:https://drive.uc.cn/s/7c4da5cd2af64 【本章下载二】:https://pan.xunlei.com/s/VOQDkRRKc5OUVTauZezaiDEHA1?pwdpybg# 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...
Oracle中的select1条、几条、指定范围的语句
在Oracle中,可以使用不同的方法来选择一条记录、多条记录或指定范围内的记录。以下是具体的实现方式: 1. 查询单条记录 使用ROWNUM伪列限制结果为1条: SELECT * FROM your_table WHERE ROWNUM 1;特点:Oracle会在结果集生成时分…...

2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息
一、框架以及准备工作 1、前端项目文件结构展示 2、后端项目文件结构展示 3、登录微信公众平台,注册一个个人的程序,获取大appid(前端后端都需要)和密钥(后端需要) 微信公众平台微信公众平台&…...
校园网规划与设计方案
一、项目概述 校园网是学校实现信息化教学、科研与管理的重要基础设施,其性能与稳定性直接影响学校的整体发展。随着学校规模不断扩大、教学科研活动日益丰富,对校园网的带宽、可靠性、安全性以及智能化管理等方面提出了更高要求。本规划与设计方案旨在构建一个高速、稳定、…...

蓝桥杯算法题 -蛇形矩阵(方向向量)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 P…...

配置VScodePython环境Python was not found;
Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases. 候试试重启电脑。 在卸载重装python后会出现难以解决的局面,系统变量,命令行&#…...

ollama 重命名模型
ollama 重命名模型 ollama list# 查看列表 ollama list # 生成原模型的Modelfile文件 ollama show --modelfile qwen3:32b > Modelfile # 从Modelfile文件创建新的模型 ollama create qwen3 -f Modelfile # 删除原模型 ollama rm qwen3:32b...

Qt信号槽机制与UI设计完全指南:从基础原理到实战应用
目录 前言一、信号槽1.1 传参1.2 Qt信号与槽的对应关系1.2.1一对多关系1.2.2 多对一关系 二、Designer三、Layout 布局3.1 基础用法3.2 打破布局3.3 贴合窗口3.4 伸展器(Spacer)3.5 嵌套布局 四、ui指针五、QWidget六、QLabel 标签使用指南总结 前言 本…...