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、總結

  • ! 是取反操作,得到的結果是布爾值,且與原值的布爾值相反。
  • !! 是強制類型轉換,得到的結果也是布爾值,和原值的布爾值相同。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80958.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80958.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于互聯網和LabVIEW的多通道數據采集系統仿真設計

標題:基于互聯網和LabVIEW的多通道數據采集系統仿真設計 內容:1.摘要 在當今科技飛速發展的背景下&#xff0c;多通道數據采集在眾多領域有著廣泛需求。本研究的目的是設計一個基于互聯網和LabVIEW的多通道數據采集系統仿真方案。采用互聯網技術實現數據的遠程傳輸與共享&…

前后端設置跨域并從后端允許發送cookie

在java后端創建config文件 package com.zf.demo.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigur…

【Java ee】關于抓包軟件Fiddler Classic的安裝與使用

Web Debugging Proxy Tool | Fiddler Classic 安裝網站↑ 下載好安裝包之后&#xff0c;雙擊一路next就可以了 一、抓包軟件 電腦上安裝了抓包軟件之后&#xff0c;抓包軟件就可以監聽你的網卡上通過的數據。 本來是你的客戶端通過網卡&#xff0c;把數據發給目標服務器&a…

【Java ee初階】http(1)

HTTP 全稱為“超文本傳輸協議”&#xff0c;由名字可知&#xff0c;這是一個基于文本格式的協議&#xff0c;而TCP&#xff0c;UDP&#xff0c;以太網&#xff0c;IP...都是基于二進制格式的協議。 如何區別該協議是基于哪種格式的協議&#xff1f; 形如這種協議格式&#xf…

登錄接口中圖片驗證碼Tesseract-OCR識別Java腳本

項目上移植了研發部的產品&#xff0c;文檔不全&#xff0c;項目上驗證碼功能無法關閉&#xff0c;又要做接口/性能測試&#xff0c;開發不配合&#xff08;作為測試多么無奈&#xff09;&#xff0c;此方法識別命中率不高&#xff0c;僅作借鑒。 版本JDK11 import io.restass…

JS手寫代碼篇---手寫 Object.create

JS手寫代碼篇 在做手寫題的時候&#xff0c;我們要思考兩個問題 這個代碼的作用是什么能夠實現的效果是什么樣子 1. 手寫 Object.create 思路&#xff1a;創造一個對象&#xff0c;類似于Object.create()方法>將obj作為原型 // 手寫 Object.create function create (ob…

全面指南:Xinference大模型推理框架的部署與使用

全面指南:Xinference大模型推理框架的部署與使用 Xinference(Xorbits Inference)是一個功能強大的分布式推理框架,專為簡化各種AI模型的部署和管理而設計。本文將詳細介紹Xinference的核心特性、版本演進,并提供多種部署方式的詳細指南,包括本地部署、Docker-Compose部署…

next.js實現項目搭建

一、創建 Next.js 項目的步驟 1、安裝 npx create-next-applatest # 或 yarn create next-app # 或 pnpm create next-app 按照交互式提示配置你的項目&#xff1a; 輸入項目名稱 選擇是否使用 TypeScript 選擇是否啟用 ESLint 選擇是否啟用 Tailwind CSS 選擇是否使用 s…

PHP基礎知識

【學習資料】 視頻&#xff1a; https://www.bilibili.com/video/BV1Xh411S7G1?spm_id_from333.788.videopod.episodes&vd_sourcebe26b82da70367069ab00d6db4f4ffc0 文檔&#xff1a;https://www.runoob.com/php/php-tutorial.html 目錄 1&#xff0c;PHP是什么2&#xff…

國內MCP服務平臺推薦 AIbase推出MCP服務器客戶端商店

在當今數字化時代&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的速度發展&#xff0c;不斷改變著我們的生活和工作方式。2025年&#xff0c;AI領域迎來了一項重要的技術進展——MCP(Model Context Protocol&#xff0c;模型上下文協議)的廣泛應用。這一技術…

在文件檢索方面doris和elasticsearch的區別

apache Doris 與 Elasticsearch 在文件檢索領域的差異源于技術架構與定位目標的本質區別,以下從核心維度對比分析二者的技術特性: 一、 ?架構設計與定位差異? ?維度??Apache Doris??Elasticsearch??核心架構?分布式 MPP 列式分析引擎,面向 OLAP 優化分布式倒排索…

鴻蒙OSUniApp打造多功能圖表展示組件 #三方框架 #Uniapp

使用UniApp打造多功能圖表展示組件 在當前移動應用開發領域&#xff0c;數據可視化已成為不可或缺的一部分。無論是展示銷售數據、用戶增長趨勢還是其他業務指標&#xff0c;一個優秀的圖表組件都能有效提升用戶體驗。UniApp作為一款跨平臺開發框架&#xff0c;如何在其中實現…

AI Agent開發第67課-徹底消除RAG知識庫幻覺-文檔分塊全技巧(1)

開篇 在上篇《AI Agent開發第66課-徹底消除RAG知識庫幻覺-帶推理的RAG》放出后,網友們反響很大。有得告訴我:原來還有Rewrite這么一招?早知道這一招很多之前的一些遺留問題都能解決了。不過在上一篇結尾我已經提到了,要真正解決一個AI Agent在響應時產生的幻覺我們用提示語…

NHANES指標推薦:OBS

文章題目&#xff1a;Association between oxidative balance score and all-cause and cancer-specific mortality among cancer survivors DOI&#xff1a;10.3389/fimmu.2025.1541675 中文標題&#xff1a;癌癥幸存者氧化平衡評分與全因死亡率和癌癥特異性死亡率之間的關聯 …

主流快遞查詢API橫向對比:快遞100快遞鳥菜鳥物流接口差異解析

主流快遞查詢API橫向對比&#xff1a;快遞100/快遞鳥/菜鳥物流接口差異解析 一、核心功能與適用范圍 菜鳥API 核心功能&#xff1a;物流信息查詢、電子面單打印、智能倉儲管理、跨境物流服務&#xff0c;整合阿里生態資源&#xff08;如淘寶、天貓訂單直接對接&#xff09;。…

解決:npm install報錯,reason: certificate has expired

目錄 1. 問題分析2. 問題解決2.1 查看配置的鏡像2.2 修改鏡像源 種一棵樹最好的時間是10年前&#xff0c;其次就是現在&#xff0c;加油&#xff01; --by蠟筆小柯南 1. 問題分析 啟動前…

緩存(5):常見 緩存數據淘汰算法/緩存清空策略

主要的三種緩存數據淘汰算法 FIFO(first in first out)&#xff1a;先進先出策略&#xff0c;最先進入緩存的數據在緩存空間不夠的情況下&#xff08;超出最大元素限制&#xff09;會被優先被清除掉&#xff0c;以騰出新的空間接受新的數據。策略算法主要比較緩存元素的創建時…

Spring框架的事務管理

引言 在企業級應用開發中&#xff0c;事務管理是一個至關重要的環節&#xff0c;它確保了數據的一致性和完整性。Spring 框架為我們提供了強大而靈活的事務管理功能&#xff0c;能夠幫助開發者更輕松地處理復雜的事務場景。本文將深入探討 Spring 框架的事務管理&#xff0c;包…

FPGA: UltraScale+ bitslip實現(ISERDESE3)

收獲 一晃五年~ 五年前那個夏夜&#xff0c;我對著泛藍的屏幕敲下《給十年后的自己》&#xff0c;在2020年的疫情迷霧中編織著對未來的想象。此刻回望&#xff0c;第四屆集創賽的參賽編號仍清晰如昨&#xff0c;而那個在家熬夜焊電路板的"不眠者"&#xff0c;現在…

用 wireshark 解密 SIP over TLS 以及 SRTP 解密

--todo 有空再搞 MicroSIP 向 FreeSWITCH 注冊&#xff0c;transport 設置為 tls 同時 Media Encryption 設置為強制 FreeSWITCH 做一個這樣的路由&#xff1a; <action application"set" data"rtp_secure_mediaoptional"/> <action applicat…