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

ES 空值合并運(yùn)算符??與可選鏈?.的使用小結(jié)

 更新時(shí)間:2026年03月18日 09:19:14   作者:兆子龍  
本文主要介紹了ES 空值合并運(yùn)算符??與可選鏈?.的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

掌握這兩個(gè)語法糖,寫出更優(yōu)雅的 JavaScript 代碼。

一、為什么需要??和?.

在日常開發(fā)中,我們經(jīng)常需要處理變量可能為 nullundefined 的情況。傳統(tǒng)的做法是使用邏輯或運(yùn)算符 || 來提供默認(rèn)值,但這種做法有一個(gè)隱蔽的陷阱。

const count = 0;
const total = count || 10;
console.log(total); // 輸出 10,而不是預(yù)期的 0

上面的代碼中,count 的值是 0,這是一個(gè)有效的數(shù)值,但 || 會把它當(dāng)作「假值」處理,返回默認(rèn)值 10。這顯然不是我們想要的結(jié)果。

空值合并運(yùn)算符 ?? 和可選鏈 ?. 的出現(xiàn),正是為了解決這類問題。它們只會在值為 nullundefined 時(shí)才進(jìn)行默認(rèn)值的處理,而不會誤傷 0false、'' 這樣的「假值」。

二、空值合并運(yùn)算符??

2.1 基本用法

空值合并運(yùn)算符 ?? 會在左側(cè)表達(dá)式值為 nullundefined 時(shí)返回右側(cè)的默認(rèn)值,否則返回左側(cè)的值。

const count = 0;
const total = count ?? 10;
console.log(total); // 輸出 0,正確!

const name = null;
const displayName = name ?? 'Anonymous';
console.log(displayName); // 輸出 'Anonymous'

const age = undefined;
const userAge = age ?? 18;
console.log(userAge); // 輸出 18

2.2 與||的區(qū)別

讓我們通過一個(gè)對比表格來清晰展示兩者的區(qū)別:

| 左側(cè)值 | a ?? b 結(jié)果 | a || b 結(jié)果 | |--------|---------------|---------------| | null | b | b | | undefined | b | b | | 0 | 0 | b | | false | false | b | | '' | '' | b | | 'hello' | 'hello' | 'hello' |

從表格可以看出,?? 只會對 null 和 undefined 「過敏」,而 || 會對所有假值過敏。在需要保留 0、false、'' 這樣的有效值的場景下,?? 是更安全的選擇。

2.3 鏈?zhǔn)绞褂?/h3>

?? 可以鏈?zhǔn)绞褂?,但需要注意?yōu)先級問題:

const a = null;
const b = undefined;
const c = 0;
const d = '';

const result1 = a ?? b ?? c ?? 'default';
console.log(result1); // 輸出 0

const result2 = a ?? b ?? d ?? 'default';
console.log(result2); // 輸出 ''

鏈?zhǔn)绞褂脮r(shí),?? 會從左到右找到第一個(gè)非 null/undefined 的值就返回。

2.4 注意事項(xiàng)

?? 不能與 && 或 || 直接混用,需要使用括號明確優(yōu)先級:

// 錯(cuò)誤寫法 - 會拋出 SyntaxError
const invalid = null || undefined ?? 'default';

// 正確寫法 - 使用括號明確優(yōu)先級
const valid1 = (null || undefined) ?? 'default';
const valid2 = null || (undefined ?? 'default');

三、可選鏈?.

3.1 基本用法

可選鏈運(yùn)算符 ?. 允許你安全地訪問嵌套對象的屬性,即使中間某個(gè)屬性不存在也不會報(bào)錯(cuò)。

const user = {
  name: 'Alice',
  address: {
    city: 'Beijing'
  }
};

// 傳統(tǒng)寫法 - 需要先判斷每一層
const city1 = user && user.address && user.address.city;

// 使用可選鏈 - 簡潔安全
const city2 = user?.address?.city;
console.log(city2); // 輸出 'Beijing'

// 訪問不存在的屬性
const country = user?.address?.country;
console.log(country); // 輸出 undefined,不會報(bào)錯(cuò)

3.2 多種用法

可選鏈不僅可以用在屬性訪問上,還支持方法調(diào)用和數(shù)組索引:

// 方法調(diào)用
const result = obj?.method?.();

// 數(shù)組索引
const firstItem = arr?.[0];

// 動(dòng)態(tài)屬性名
const value = obj?.[key];

3.3 實(shí)際應(yīng)用場景

在實(shí)際開發(fā)中,可選鏈特別適合處理以下場景:

// 1. 處理表單數(shù)據(jù)
const formData = {
  user: {
    profile: {
      name: 'Bob'
    }
  }
};

// 安全獲取用戶名,即使中間某層不存在
const userName = formData?.user?.profile?.name ?? 'Guest';

// 2. 處理 API 響應(yīng)
async function fetchUser() {
  const response = await fetch('/api/user');
  const data = await response.json();
  
  // 安全訪問嵌套數(shù)據(jù)
  const email = data?.user?.contact?.email ?? 'no-email';
  const avatar = data?.user?.profile?.avatar ?? '/default-avatar.png';
  
  return { email, avatar };
}

// 3. 處理可選的回調(diào)函數(shù)
function handleClick(event) {
  // 某些情況下 onClick 可能未定義
  event?.preventDefault?.();
  callback?.(event);
}

3.4 短路求值

可選鏈具有短路求值的特性:如果 ?. 左側(cè)的值為 null 或 undefined,右側(cè)的表達(dá)式不會被執(zhí)行。

const obj = null;
let count = 0;

// 不會執(zhí)行,因?yàn)?obj 為 null
const result = obj?.method(() => count++);

console.log(count); // 輸出 0,callback 沒有被執(zhí)行

這個(gè)特性在包含副作用的表達(dá)式中特別有用,可以避免不必要的函數(shù)調(diào)用。

四、組合使用?.??

?. 和 ?? 可以組合使用,處理更復(fù)雜的場景:

const config = {
  database: {
    host: null,
    port: 5432
  }
};

// 安全獲取數(shù)據(jù)庫配置,主機(jī)為空時(shí)使用默認(rèn)值
const dbHost = config?.database?.host ?? 'localhost';
const dbPort = config?.database?.port ?? 3306;

console.log(dbHost); // 輸出 'localhost'
console.log(dbPort); // 輸出 5432

// 處理深層嵌套的配置對象
const settings = {
  ui: {
    theme: {
      colors: null
    }
  }
};

const primaryColor = settings?.ui?.theme?.colors?.primary ?? '#1890ff';
console.log(primaryColor); // 輸出 '#1890ff'

五、TypeScript 中的使用

在 TypeScript 中使用 ?? 和 ?. 時(shí),類型系統(tǒng)能夠正確推斷出可能的類型:

interface User {
  name: string;
  address?: {
    city: string;
    zipCode?: string;
  };
}

const user: User = {
  name: 'Alice'
};

// 可選鏈返回 undefined 或 string,類型為 string | undefined
const city = user.address?.city;

// 空值合并確保最終類型為 string
const zipCode = user.address?.zipCode ?? '000000';

六、瀏覽器兼容性

截至 2026 年,?? 和 ?. 已經(jīng)在所有主流瀏覽器中得到支持,包括 Chrome、Firefox、Safari 和 Edge 的最新版本。對于需要兼容舊版瀏覽器的項(xiàng)目,可以使用 Babel 或 TypeScript 進(jìn)行轉(zhuǎn)譯。

// .babelrc 或 babel.config.js
{
  "plugins": [
    "@babel/plugin-proposal-optional-chaining",
    "@babel/plugin-proposal-nullish-coalescing-operator"
  ]
}

七、常見誤區(qū)

第一個(gè)誤區(qū)是認(rèn)為 ?? 可以完全替代 ||。實(shí)際上,|| 在需要區(qū)分「未設(shè)置」和「設(shè)置了假值」的場景下仍然有用。比如表單驗(yàn)證中,空字符串可能是一個(gè)有效的輸入值。

第二個(gè)誤區(qū)是過度使用可選鏈。雖然可選鏈很方便,但在確定某屬性一定存在的情況下,使用普通屬性訪問(.)性能更好,代碼意圖也更清晰。

第三個(gè)誤區(qū)是在條件判斷中混用 ?? 和 &&/||。由于運(yùn)算符優(yōu)先級不同,混用時(shí)必須使用括號來明確意圖。

總結(jié)

?? 和 ?. 是 ES2020 引入的兩個(gè)非常實(shí)用的語法糖。?? 解決了 || 在處理假值時(shí)的誤傷問題,?. 讓深層嵌套對象的訪問變得安全簡潔。合理使用這兩個(gè)特性,可以讓你的 JavaScript 代碼更加健壯和優(yōu)雅。

到此這篇關(guān)于ES 空值合并運(yùn)算符??與可選鏈?.的使用小結(jié)的文章就介紹到這了,更多相關(guān) ES空值合并運(yùn)算符??與可選鏈?.內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript制作簡單計(jì)算器功能

    JavaScript制作簡單計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript制作簡單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 基于js中style.width與offsetWidth的區(qū)別(詳解)

    基于js中style.width與offsetWidth的區(qū)別(詳解)

    下面小編就為就大家?guī)硪黄趈s中style.width與offsetWidth的區(qū)別(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • JavaScript利用正則表達(dá)式來禁止鍵盤輸入數(shù)字

    JavaScript利用正則表達(dá)式來禁止鍵盤輸入數(shù)字

    本文主要介紹了JavaScript利用正則表達(dá)式來禁止鍵盤輸入數(shù)字,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 用svg制作富有動(dòng)態(tài)的tooltip

    用svg制作富有動(dòng)態(tài)的tooltip

    這篇文章主要介紹了用svg制作富有動(dòng)態(tài)的tooltip的代碼以及制作過程,十分的細(xì)致全面,有需要的小伙伴可以參考下。
    2015-07-07
  • 基于jQuery的圖片不完全按比例自動(dòng)縮小

    基于jQuery的圖片不完全按比例自動(dòng)縮小

    有時(shí)我們會有這樣的需求:讓圖片顯示在固定大小的區(qū)域。如果不考慮 IE6 完全可以使用 css 的 max-width 限制寬度自動(dòng)按比例縮小顯示,但是這樣有個(gè)問題,就是如果按比例縮小后,圖片高度不夠,那么就很難看了
    2014-07-07
  • 最新評論

    呼伦贝尔市| 于都县| 吉木乃县| 黔西县| 大名县| 香河县| 丰镇市| 金平| 沂源县| 金昌市| 马山县| 南宁市| 仁化县| 宁化县| 赤峰市| 洞口县| 玉龙| 朔州市| 北票市| 肇东市| 平罗县| 南丹县| 侯马市| 界首市| 瑞金市| 桂东县| 光泽县| 炉霍县| 普格县| 高要市| 鄂伦春自治旗| 浦北县| 措美县| 遂昌县| 舟山市| 英超| 宁城县| 阿合奇县| 化隆| 正安县| 万宁市|