最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript雙問(wèn)號(hào)(??)操作符用法詳解

 更新時(shí)間:2025年04月08日 11:01:12   作者:watermelo37  
在現(xiàn)代JavaScript開(kāi)發(fā)中,處理變量默認(rèn)值是一個(gè)常見(jiàn)但容易引發(fā)bug的操作,很多開(kāi)發(fā)者可能都遇到過(guò)這樣的問(wèn)題:使用||設(shè)置默認(rèn)值時(shí),意外覆蓋了0、''等合法值,這時(shí)候,ES2020引入的雙問(wèn)號(hào)操作符(??)就能完美解決這類問(wèn)題,本文將帶您全面掌握這個(gè)操作符的使用場(chǎng)景和高級(jí)技巧

一、雙問(wèn)號(hào)操作符??的基礎(chǔ)用法

1、傳統(tǒng)方式的痛點(diǎn)

const count = 0;
const result = count || 10; // 得到10,但0可能是有效值

使用||時(shí),會(huì)把所有假值 (falsy values)視為無(wú)效值,包括:0、''、false、NaN、null、undefined。這在處理數(shù)字表單、開(kāi)關(guān)狀態(tài)等場(chǎng)景時(shí)會(huì)引發(fā)問(wèn)題。

以上述案例來(lái)說(shuō),我想要count被賦值的情況下就使用count的值,要是沒(méi)有被賦值就使用默認(rèn)值10,但是當(dāng)count被初始化并賦值為0的時(shí)候,邏輯或操作符||依然會(huì)認(rèn)為是無(wú)效值,并將result賦值為10,這顯然和我預(yù)期的結(jié)果相悖。這是因?yàn)镴avaScript是一門弱類型語(yǔ)言,會(huì)進(jìn)行強(qiáng)制類型轉(zhuǎn)換。

2、雙問(wèn)號(hào)操作符??的精確判斷

同樣還是這個(gè)例子:

const count = 0;
const result = count ?? 10; // 得到0,完美保留有效值

此時(shí)result的結(jié)果就是10,因?yàn)??操作符只對(duì)null和undefined這兩個(gè)原始值進(jìn)行判斷,其他假值都會(huì)被保留。這種特性使其特別適合處理以下場(chǎng)景:

  • 表單輸入值(允許0或空字符串)
  • 布爾類型配置項(xiàng)
  • 數(shù)字類型參數(shù)(允許0)

3、雙問(wèn)號(hào)操作符??與邏輯或操作符||的對(duì)比

特性?? 操作符 || 操作符
觸發(fā)條件

僅 null/undefined

所有假值
適用場(chǎng)景精準(zhǔn)空值判斷快速默認(rèn)值設(shè)置
處理 0 和 ''保留有效值覆蓋為默認(rèn)值
處理 false保留布爾值覆蓋為默認(rèn)值

二、復(fù)雜場(chǎng)景下的空值處理

1、深層嵌套對(duì)象的默認(rèn)值

結(jié)合可選鏈操作符(?.),可以安全地處理多層嵌套對(duì)象的屬性訪問(wèn)。

const config = {
  api: {
    v1: {
      endpoint: ''
    }
  }
};
 
// 傳統(tǒng)寫法(需要逐層判斷)
const endpoint = config.api?.v1?.endpoint || 'default';
 
// 使用??的改進(jìn)寫法
const endpoint = config.api?.v1?.endpoint ?? 'default';

2、函數(shù)參數(shù)的默認(rèn)值陷阱

當(dāng)函數(shù)參數(shù)需要接收布爾值時(shí),使用??可以避免意外覆蓋用戶傳入的false值。

function createPost(data) {
  // 錯(cuò)誤寫法:會(huì)覆蓋有效布爾值
  const isPublic = data.isPublic || true;
  
  // 正確寫法:僅處理null/undefined
  const isPublic = data.isPublic ?? true;
}

3、多條件回退策略

通過(guò)鏈?zhǔn)绞褂??,可以實(shí)現(xiàn)多層級(jí)的配置回退機(jī)制,這種模式在讀取環(huán)境變量時(shí)特別實(shí)用。

const theme = userConfig.theme 
  ?? systemConfig.theme 
  ?? process.env.THEME 
  ?? 'light';

三、實(shí)戰(zhàn)案例解析

1、Vue組件中的Prop處理

如果disabled接收的值為false,如果使用邏輯或操作符,就會(huì)被認(rèn)為是無(wú)效值,從而使用默認(rèn)的true值。如果使用雙問(wèn)號(hào)操作符就可以避免這種情況。

<template>
  <input :disabled="isDisabled" />
</template>
 
<script>
export default {
  props: {
    disabled: {
      type: Boolean,
      default: undefined
    }
  },
  computed: {
    isDisabled() {
      return this.disabled ?? true;
    }
  }
}
</script>

2、表單驗(yàn)證

就算你不允許用戶輸入空格,起碼要允許用戶輸入0和引號(hào)吧?如果使用邏輯或操作符,根本無(wú)法通過(guò)表單驗(yàn)證,使用雙問(wèn)號(hào)操作符就可以避免這種情況。

function validateForm(formData) {
  const errors = [];
  
  if (formData.username?.trim() ?? false) {
    errors.push('用戶名不能為空');
  }
  
  if (formData.age ?? false) {
    errors.push('年齡必須填寫');
  }
  
  return errors;
}

四、雙問(wèn)號(hào)操作符的性能優(yōu)勢(shì)

實(shí)際測(cè)試顯示,??在性能上與||基本持平,但在處理復(fù)雜對(duì)象時(shí)更具優(yōu)勢(shì)。這是因?yàn)殡p問(wèn)號(hào)操作符只檢查null和undefined,比||操作符的類型轉(zhuǎn)換操作更高效。

當(dāng)然,這部分差異很小,更多的作用是展示開(kāi)發(fā)者的思維能力。

// 測(cè)試環(huán)境:Chrome 112,100萬(wàn)次運(yùn)算
console.time('||');
for (let i = 0; i < 1000000; i++) null || 10;
console.timeEnd('||'); // 2.1ms
 
console.time('??');
for (let i = 0; i < 1000000; i++) null ?? 10;
console.timeEnd('??'); // 1.8ms

五、結(jié)語(yǔ)

雙問(wèn)號(hào)操作符(??)這個(gè)看似簡(jiǎn)單的語(yǔ)法糖,實(shí)則蘊(yùn)含著提升代碼健壯性的強(qiáng)大能力。在實(shí)際項(xiàng)目中,建議結(jié)合TypeScript的嚴(yán)格空值檢查,構(gòu)建更可靠的類型安全體系。

拓展:雙問(wèn)號(hào)(??)和或運(yùn)算符(||)的區(qū)別和使用

1.?? 和 || 的區(qū)別

在 JavaScript 中,雙問(wèn)號(hào)(??)和或運(yùn)算符(||)都可以用來(lái)設(shè)置默認(rèn)值,但是它們處理 Falsy 值的方式不同。

|| 運(yùn)算符在遇到 Falsy 值時(shí)會(huì)返回第一個(gè)真值(Truthy)操作數(shù),否則返回最后一個(gè)操作數(shù)。例如:

const x = null;
const y = x || "default";
console.log(y); // "default"

在上面的代碼中,變量 y 的值將是 “default”,因?yàn)?x 的值為 null,null 是一個(gè) Falsy 值,所以 y 的值返回了 “default”。

而雙問(wèn)號(hào)運(yùn)算符(??)只在左側(cè)的值為 null 或 undefined 時(shí)返回右側(cè)的值,否則返回左側(cè)的值。例如:

const x = null;
const y = x ?? "default";
console.log(y); // null

在上面的代碼中,變量 y 的值將是 null,因?yàn)?x 的值為 null,而 ?? 運(yùn)算符只會(huì)在左側(cè)的值為 null 或 undefined 時(shí)返回右側(cè)的默認(rèn)值。

因此,雙問(wèn)號(hào)運(yùn)算符和或運(yùn)算符的區(qū)別在于它們?cè)谔幚?Falsy 值時(shí)的行為不同?;蜻\(yùn)算符會(huì)將 Falsy 值視為假,而雙問(wèn)號(hào)運(yùn)算符只在左側(cè)的值為 null 或 undefined 時(shí)才返回右側(cè)的默認(rèn)值。

在實(shí)際使用中,當(dāng)需要設(shè)置默認(rèn)值時(shí),可以使用雙問(wèn)號(hào)運(yùn)算符來(lái)避免將 Falsy 值視為默認(rèn)值。例如:

const x = 0;
const y = x ?? 42;
console.log(y); // 0

在上面的代碼中,變量 y 的值將是 0,因?yàn)?x 的值為 0,而 0 不是 Falsy 值,所以 y 的值返回了 0。如果使用或運(yùn)算符來(lái)設(shè)置默認(rèn)值,那么 y 的值將會(huì)是 42,這可能不是我們期望的結(jié)果。

總之,雙問(wèn)號(hào)運(yùn)算符可以更加準(zhǔn)確地設(shè)置默認(rèn)值,避免將 Falsy 值視為默認(rèn)值。

2.?? 和 || 的使用

在 JavaScript 中,雙問(wèn)號(hào)(“??”)被稱為 Nullish Coalescing 運(yùn)算符,它用于處理變量值為 null 或 undefined 的情況。

具體來(lái)說(shuō),雙問(wèn)號(hào)運(yùn)算符返回其左側(cè)的操作數(shù),如果它的值是 null 或 undefined,則返回右側(cè)的操作數(shù)。例如:

const x = null;
const y = x ?? "default";
console.log(y); // "default"

在上面的代碼中,變量 y 的值將是 “default”,因?yàn)?x 的值為 null,而雙問(wèn)號(hào)運(yùn)算符會(huì)返回右側(cè)的默認(rèn)值。

請(qǐng)注意,雙問(wèn)號(hào)運(yùn)算符僅在其左側(cè)的值為 null 或 undefined 時(shí)才返回右側(cè)的默認(rèn)值。如果左側(cè)的值為 “”(空字符串)、0 或 false,則左側(cè)的值仍然被視為有效值,雙問(wèn)號(hào)運(yùn)算符不會(huì)返回右側(cè)的默認(rèn)值。

例如:

const a = "";
const b = a ?? "default";
console.log(b); // ""

在上面的代碼中,變量 b 的值將是 “”,因?yàn)?a 的值為 “”,而雙問(wèn)號(hào)運(yùn)算符會(huì)將其視為有效值,不會(huì)返回右側(cè)的默認(rèn)值。

以上就是JavaScript雙問(wèn)號(hào)(??)操作符用法詳解的詳細(xì)內(nèi)容,更多關(guān)于JavaScript雙問(wèn)號(hào)??用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript 中 JSON.parse 函數(shù) 和 JSON.stringify 函數(shù)

    JavaScript 中 JSON.parse 函數(shù) 和 JSON.stringify 函數(shù)

    這篇文章主要介紹了JavaScript -- JSON.parse 函數(shù) 和 JSON.stringify 函數(shù),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-12-12
  • JS+CSS實(shí)現(xiàn)的經(jīng)典tab選項(xiàng)卡效果代碼

    JS+CSS實(shí)現(xiàn)的經(jīng)典tab選項(xiàng)卡效果代碼

    這篇文章主要介紹了JS+CSS實(shí)現(xiàn)的經(jīng)典tab選項(xiàng)卡效果代碼,通過(guò)簡(jiǎn)單的鼠標(biāo)事件觸發(fā)js函數(shù)實(shí)現(xiàn)針對(duì)頁(yè)面元素的遍歷與樣式變換功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • 怎么理解wx.navigateTo的events參數(shù)使用詳情

    怎么理解wx.navigateTo的events參數(shù)使用詳情

    這篇文章主要介紹了怎么理解wx.navigateTo的events參數(shù)使用詳情,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 詳解如何替換項(xiàng)目中的if-else和switch

    詳解如何替換項(xiàng)目中的if-else和switch

    這篇文章主要為大家介紹了詳解如何替換項(xiàng)目中的if-else和switch,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • ES6 Array常用擴(kuò)展的應(yīng)用實(shí)例分析

    ES6 Array常用擴(kuò)展的應(yīng)用實(shí)例分析

    這篇文章主要介紹了ES6 Array常用擴(kuò)展的應(yīng)用,結(jié)合實(shí)例形式分析各種常見(jiàn)擴(kuò)展方法針對(duì)Array數(shù)組的轉(zhuǎn)換、遍歷、查找、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • Bootstrap每天必學(xué)之柵格系統(tǒng)(布局)

    Bootstrap每天必學(xué)之柵格系統(tǒng)(布局)

    Bootstrap每天必學(xué)之柵格系統(tǒng),小編對(duì)Bootstrap柵格系統(tǒng)(布局)也很陌生,特分享整理這篇文章,感興趣的小伙伴們可以參考一下
    2015-11-11
  • clipboard.js在移動(dòng)端復(fù)制失敗的解決方法

    clipboard.js在移動(dòng)端復(fù)制失敗的解決方法

    最近在使用clipboard.js碰到的一個(gè)小問(wèn)題,通過(guò)查找相關(guān)資料解決了,所以下面這篇文章主要給大家介紹了關(guān)于clipboard.js在移動(dòng)端復(fù)制失敗的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • javascript跨域的方法匯總

    javascript跨域的方法匯總

    JavaScript出于安全方面的考慮,不允許跨域調(diào)用其他頁(yè)面的對(duì)象。但在安全限制的同時(shí)也給注入iframe或是ajax應(yīng)用上帶來(lái)了不少麻煩。這里把涉及到跨域的一些問(wèn)題簡(jiǎn)單地整理一下
    2015-10-10
  • JavaScript實(shí)現(xiàn)的鼠標(biāo)跟隨特效示例【2則實(shí)例】

    JavaScript實(shí)現(xiàn)的鼠標(biāo)跟隨特效示例【2則實(shí)例】

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)的鼠標(biāo)跟隨特效,結(jié)合2則實(shí)例形式分析了javascript針對(duì)鼠標(biāo)事件的響應(yīng)、計(jì)算、處理及頁(yè)面元素動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-12-12
  • vue3中Element Plus全局組件配置中文的兩種方案

    vue3中Element Plus全局組件配置中文的兩種方案

    element-plus組件文字語(yǔ)言默認(rèn)是英文,需要手動(dòng)更改一下中文包 ,本文主要介紹了vue3中Element Plus全局組件配置中文的兩種方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12

最新評(píng)論

布尔津县| 亚东县| 尼玛县| 江西省| 尤溪县| 呼玛县| 淮阳县| 绥芬河市| 惠水县| 乐陵市| 大同市| 北京市| 太白县| 沁阳市| 盐山县| 滕州市| 介休市| 崇阳县| 临夏市| 鄂托克前旗| 杨浦区| 安宁市| 潮州市| 加查县| 静安区| 恭城| 鄢陵县| 榆林市| 石嘴山市| 象山县| 阳谷县| 武安市| 洪江市| 深水埗区| 廊坊市| 广南县| 县级市| 安远县| 太白县| 夏邑县| 秦安县|