javascript —— ! 和 !! 的区别与作用

news2025/5/16 10:42:22

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);      // true

console.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);     // false

console.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、总结

  • ! 是取反操作,得到的结果是布尔值,且与原值的布尔值相反。
  • !! 是强制类型转换,得到的结果也是布尔值,和原值的布尔值相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git-学习笔记(粗略版)

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

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

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

【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…

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

注&#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 …

【高频面试题】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日龙虎榜行业方向分析 一…

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

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

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权限…

【免费分享】虚拟机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/…

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 标签使用指南总结 前言 本…

XBL6501/02/03在POE设备上的应用方案

前言&#xff1a; 在当今数字化时代&#xff0c;POE&#xff08;Power over Ethernet&#xff09;设备因其能够通过以太网线同时传输数据和电力而被广泛应用。为了满足这些设备日益增长的电源需求&#xff0c;芯伯乐推出了XBL6501/02/03系列DC-DC电源芯片&#xff0c;为POE设备…

编程题 03-树2 List Leaves【PAT】

文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. 输入格式 Each input file contains one test case. For each case, …

生信小白学Rust-03

语句和表达式 举个栗子&#x1f330; fn add_with_extra(x: i32, y: i32) -> i32 {let x x 1; // 语句let y y 5; // 语句x y // 表达式 } // 语句执行操作 // 表达式会返回一个值 怎么区分呢&#xff0c;目前我的理解是只要返回了值&#xff0c;那它就是表达式 fn…

缺乏需求优先级划分时,如何合理分配资源?

当需求优先级不明确时&#xff0c;合理分配资源的关键在于建立统一评估标准、实施敏捷资源管理、提升团队协作效率、加强跨部门沟通机制。尤其是建立统一评估标准至关重要&#xff0c;它能帮助组织快速判断各项需求的重要性与紧迫性&#xff0c;从而实现资源的动态匹配与有效利…