当前位置: 首页 > article >正文

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 里&#xff0c;! 和 !! 是两种不同的逻辑运算符&#xff0c;它们的功能和使用场景有明显区别。 1、 !&#xff08;逻辑非运算符&#xff09; 它的主要作用是 对操作数进行布尔值取反。具体来说&#xff0c;就是 先把操作…...

鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集

ArkUI 组件速查表 鸿蒙应用开发页面上需要实现的 UI 功能组件如果在这 100 多个组件里都找不到&#xff0c;那就需要组合造轮子了 使用技巧&#xff1a;先判断需要实现的组件大方向&#xff0c;比如“选择”、“文本”、“信息”等&#xff0c;或者是某种形状比如“块”、“图…...

LLM笔记(三)位置编码(1)

位置编码理论与应用 1. 位置编码如何解决置换不变性及其数学表现 在Transformer模型中&#xff0c;自注意力机制&#xff08;Self-Attention&#xff09;具有置换不变性&#xff08;permutation invariance&#xff09;&#xff0c;这意味着对输入序列的词元&#xff08;toke…...

麒麟v10 部署 MySQL 5.6.10 完整步骤

需要包的私信我 一、安装依赖&#xff08;Perl环境&#xff09; # 在线安装依赖 yum -y install perl perl-devel# 离线安装&#xff08;需提前下载好rpm包&#xff09; mkdir /data/ybn/soft/pre yum install --downloadonly --downloaddir/data/ybn/soft/pre perl perl-dev…...

Git-学习笔记(粗略版)

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

专项智能练习(定义判断)

1. 单选题 热传导是介质内无宏观运动时的传热现象&#xff0c;其在固体、液体和气体中均可发生。但严格而言&#xff0c;只有在固体中才是纯粹的热传导&#xff0c;在流体&#xff08;泛指液体和气体&#xff09;中又是另外一种情况&#xff0c;流体即使处于静止状态&#xff…...

失控的产品

大部分程序员很难有机会做一个新的产品&#xff0c;绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会&#xff0c;从2023年开始做&#xff0c;中间经历了许多磕磕碰碰。 有的小伙伴从中离开&#xff0c;偶尔又加入1~2个人&#xff0c;但…...

【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error

Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考&#xff1a;https://www.bilibili.com/opus/977469285985157129 A9 - A11&#xff08;iPhone6s&#xff0d;X&#xff09;&#xff1a;iOS15.0-16.6.1 A12-A14&#xff08;iPhoneXR&#xff0d;12PM&#xf…...

无线定位之 二 SX1302 网关源码 thread_down 线程详解

前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

对心理幸福感含义的探索 | 幸福就是一切吗?

注&#xff1a;机翻&#xff0c;未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗&#xff1f;对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …...

多平台图标设计与管理的终极解决方案

IconWorkshop Pro 是一款由Axialis团队开发的专业图标设计与制作软件&#xff0c;专注于为设计师、开发者及企业用户提供高效且灵活的图标创作解决方案。该软件凭借其强大的功能与跨平台适配性&#xff0c;成为Windows、macOS、iOS、Android等多系统图标设计的首选工具之一。 …...

ngx_http_keyval_module动态键值管理

一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module&#xff0c;说明模块已编译进 NGINX。 若未找到&#xff0c;请联系你的 NGINX 供应商&#xff0c;获取商业版或重新编译并启用该模块&am…...

【高频面试题】LRU缓存

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

讯联云库项目开发日志(二)AOP参数拦截

目录 利用AOP实现参数拦截: 一、​​HTTP请求进入Controller​&#xff08;发送邮件验证码&#xff09; 二、AOP切面触发 1. 切面拦截&#xff08;GlobalOperactionAspect.class&#xff09; method.getAnnotation()​​ null interceptor 判断​​ 2.参数校验注解 3. 参…...

龙虎榜——20250515

上证指数缩量收阴线&#xff0c;个股跌多涨少&#xff0c;上涨波段4月9日以来已有24个交易日&#xff0c;时间周期上处于上涨末端&#xff0c;注意风险。 深证指数缩量收阴线&#xff0c;日线上涨结束的概率在增大&#xff0c;注意风险。 2025年5月15日龙虎榜行业方向分析 一…...

知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑

1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法&#xff0c;搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命&#xff1a;在电商场景中&#xff0c;传统的「关键词匹配」已无法满足个性化购物需求&#xff0c;MOE搜索等新一代架构开始融合知识图谱…...

python-修改图片背景色

在Python中&#xff0c;可以使用图像处理库&#xff08;如OpenCV或Pillow&#xff09;来修改图片的背景色。通常&#xff0c;修改背景色的流程包括以下步骤&#xff1a; 1、对图片进行分割&#xff0c;识别前景和背景。 2、对背景区域进行颜色替换。 下面是两种实现方法&#x…...

卡洛诗,将高端西餐的冗余价值转化为普惠体验

西餐市场正经历一场结构性变革&#xff0c;一二线城市的高端西餐陷入内卷&#xff0c;而下沉市场却因品质与价格断层陷入选择困境——消费者既不愿为高价西餐的面子溢价买单&#xff0c;又难以忍受快餐式西餐的粗糙体验。这一矛盾催生了万亿级的市场真空地带&#xff0c;萨莉亚…...

【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在键盘的上方加一个完成按钮

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

SQL注入---05--跨站注入

1 权限说明 select * from mysql.user; 这里的Y表示我前面的命令权限为root&#xff0c;n表示不支持root权限 导致结果&#xff1a; 如果为root的话&#xff0c;我就可操作这些命令并且可以进行跨数据库攻击&#xff0c;但是如果不是高权限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

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/7c4da5cd2af64 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDkRRKc5OUVTauZezaiDEHA1?pwdpybg# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…...

Oracle中的select1条、几条、指定范围的语句

在Oracle中&#xff0c;可以使用不同的方法来选择一条记录、多条记录或指定范围内的记录。以下是具体的实现方式&#xff1a; 1. 查询单条记录 使用ROWNUM伪列限制结果为1条&#xff1a; SELECT * FROM your_table WHERE ROWNUM 1;特点&#xff1a;Oracle会在结果集生成时分…...

2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息

一、框架以及准备工作 1、前端项目文件结构展示 2、后端项目文件结构展示 3、登录微信公众平台&#xff0c;注册一个个人的程序&#xff0c;获取大appid&#xff08;前端后端都需要&#xff09;和密钥&#xff08;后端需要&#xff09; 微信公众平台微信公众平台&…...

校园网规划与设计方案

一、项目概述 校园网是学校实现信息化教学、科研与管理的重要基础设施,其性能与稳定性直接影响学校的整体发展。随着学校规模不断扩大、教学科研活动日益丰富,对校园网的带宽、可靠性、安全性以及智能化管理等方面提出了更高要求。本规划与设计方案旨在构建一个高速、稳定、…...

蓝桥杯算法题 -蛇形矩阵(方向向量)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 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后会出现难以解决的局面&#xff0c;系统变量&#xff0c;命令行&#…...

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 伸展器&#xff08;Spacer&#xff09;3.5 嵌套布局 四、ui指针五、QWidget六、QLabel 标签使用指南总结 前言 本…...