97免费在线观看视频 I 午夜夫妻视频 I 久久久久久网站 I 天堂网男人 I 欧美大波大乳人奶 I 丝袜 中出 制服 人妻 美腿 I 窝窝午夜理论片影院 I 日韩在线伦理电影 I 韩国特级毛片 I 亚洲欧美另类激情 I 在线成人日韩 I 麻豆视频免费看 I 黄色生活毛片 I 极品一线天小嫩嫩真紧 I 色久天堂 I 久久久久久黄色片 I 林智妍三级露全乳电影视频 I 大肉大捧一进一出好爽视频 I 空乘伦理hd I 少妇口述与子做过爱 I 成人免费影片 I 国产精品国内免费一区二区三区 I 日韩制服一区 I 青青草福利在线 I 日本在线观看不卡视频 I 婷婷六月综合亚洲 I 国产又粗又黄又硬 I 美女扒开屁股让男子桶爽 I 欧美性午夜视频观看 I 欧美狠狠插 I 亚洲福利在线观看视频 I 无码抽搐高潮喷水流白浆 I 亚洲欧美国产日韩色伦 I 你懂的视频网站在线观看 I www.蜜桃视频在线观看 I 日本无码人妻精品一区二区蜜桃 I 久久中文字幕人妻丝袜 I 碰草在线视频 I 日韩精品成人av网站

ES2020 系列:空值合并運(yùn)算符 '??'

2020/10/27 10:04:30   閱讀:2612    發(fā)布者:2612

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

在本文中,我們將值既不是null 也不是undefined 的表達(dá)式稱為已定義的(defined

空值合并運(yùn)算符(nullish coalescing operator)的寫法為兩個(gè)問號??

a ?? b 的結(jié)果是:

  • 如果a 是已定義的,則結(jié)果為a,
  • 如果a 不是已定義的,則結(jié)果為b。

換句話說,如果第一個(gè)參數(shù)不是null/undefined,則?? 返回第一個(gè)參數(shù)。否則,返回第二個(gè)參數(shù)。

空值合并運(yùn)算符并不是什么全新的東西。它只是一種獲得兩者中的第一個(gè)已定義的值的不錯(cuò)的語法。

我們可以使用我們已知的運(yùn)算符重寫result = a ?? b,像這樣:

result = (a !== null && a !== undefined) ? a : b;

通常?? 的使用場景是,為可能是未定義的變量提供一個(gè)默認(rèn)值。

例如,在這里,如果user 是未定義的,我們則顯示Anonymous

let user;
alert(user ?? "Anonymous"); // Anonymous

當(dāng)然,如果user 的值為除null/undefined 外的任意值,那么我們看到的將是它:

let user = "John";
alert(user ?? "Anonymous"); // John

我們還可以使用?? 序列從一系列的值中選擇出第一個(gè)非null/undefined 的值。

假設(shè)我們在變量firstNamelastName nickName 中存儲(chǔ)著一個(gè)用戶的數(shù)據(jù)。如果用戶決定不輸入值,則所有這些變量的值都可能是未定義的。

我們想使用這些變量之一顯示用戶名,如果這些變量的值都是未定義的,則顯示 "Anonymous"

讓我們使用?? 運(yùn)算符來實(shí)現(xiàn)這一需求:

let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// 顯示第一個(gè)已定義的值
alert(firstName ?? lastName ?? nickName ?? "Anonymous"); // Supercoder

|| 比較

或運(yùn)算符|| 可以以與?? 運(yùn)算符相同的方式使用。

例如,在上面的代碼中,我們可以用|| 替換掉??,也可以獲得相同的結(jié)果:

let firstName = null;
let lastName = null;
let nickName = "Supercoder";
// 顯示第一個(gè)真值:
alert(firstName || lastName || nickName || "Anonymous"); // Supercoder

|| 運(yùn)算符自 JavaScript 誕生就存在,因此開發(fā)者長期將其用于這種目的。

另一方面,空值合并運(yùn)算符?? 是最近才被添加到 JavaScript 中的,它的出現(xiàn)是因?yàn)槿藗儗?span>|| 不太滿意。

它們之間重要的區(qū)別是:

  • || 返回第一個(gè) 值。
  • ?? 返回第一個(gè) 已定義的 值。

換句話說,|| 無法區(qū)分false0、空字符串"" null/undefined。它們都一樣 —— 假值(falsy values)。如果其中任何一個(gè)是|| 的第一個(gè)參數(shù),那么我們將得到第二個(gè)參數(shù)作為結(jié)果。

不過在實(shí)際中,我們可能只想在變量的值為null/undefined 時(shí)使用默認(rèn)值。也就是說,當(dāng)該值確實(shí)未知或未被設(shè)置時(shí)。

例如,考慮下面這種情況:

let height = 0;
alert(height || 100); // 100
alert(height ?? 100); // 0
  • height || 100 首先會(huì)檢查height 是否為一個(gè)假值,發(fā)現(xiàn)它確實(shí)是。
    • 所以,結(jié)果為第二個(gè)參數(shù),100。
  • height ?? 100 首先會(huì)檢查height 是否為null/undefined,發(fā)現(xiàn)它不是。
    • 所以,結(jié)果為height 的原始值,0。

如果高度0 為有效值,則不應(yīng)將其替換為默認(rèn)值,所以?? 能夠得出正確的結(jié)果。

優(yōu)先級

?? 運(yùn)算符的優(yōu)先級相當(dāng)?shù)停涸?MDN table 中為5。因此,?? = ? 之前計(jì)算,但在大多數(shù)其他運(yùn)算符(例如,+ *)之后計(jì)算。

因此,如果我們需要在還有其他運(yùn)算符的表達(dá)式中使用?? 進(jìn)行取值,需要考慮加括號:

let height = null;
let width = null;
// 重要:使用括號
let area = (height ?? 100) * (width ?? 50);
alert(area); // 5000

否則,如果我們省略了括號,則由于* 的優(yōu)先級比?? 高,它會(huì)先執(zhí)行,進(jìn)而導(dǎo)致錯(cuò)誤的結(jié)果。

// 沒有括號
let area = height ?? 100 * width ?? 50;
// ……與下面這行代碼的計(jì)算方式相同(應(yīng)該不是我們所期望的):
let area = height ?? (100 * width) ?? 50;

?? 與&& 或|| 一起使用

出于安全原因,JavaScript 禁止將?? 運(yùn)算符與&& || 運(yùn)算符一起使用,除非使用括號明確指定了優(yōu)先級。

下面的代碼會(huì)觸發(fā)一個(gè)語法錯(cuò)誤:

let x = 1 && 2 ?? 3; // Syntax error

這個(gè)限制無疑是值得商榷的,但它被添加到語言規(guī)范中是為了避免人們從|| 切換到?? 時(shí)的編程錯(cuò)誤。

可以明確地使用括號來解決這個(gè)問題:

let x = (1 && 2) ?? 3; // 正常工作了
alert(x); // 2

鏈接:https://juejin.im/post/6884019851942166536

主站蜘蛛池模板: 亚洲色婷婷婷婷五月基地 | 日本区一区二 | 国产成人午夜精品福利视频 | 九色视频在线观看 | 国产精品69久久久久孕妇欧美 | 色噜噜综合 | 91久久亚洲| 成人亚洲a片v一区二区三区动漫 | 成人免费看片98图片 | 97久久爽久久爽爽久久片 | 青青草在线免费观看 | 好吊日在线 | 亲子乱一区二区三区 | 国产成人无码短视频 | 韩国av一区二区三区 | 日韩精品在线观看一区 | 一色桃子656中文字幕 | 四虎最新在线永久免费 | 国产日产精品一区二区三区四区的观看方式 | 精品毛卡卡1卡2卡3麻豆 | 日日插插 | 欧美九九九| gai在线观看免费高清 | 91九色国产视频 | 亚洲一区二区三区在线观看网站 | 理论片亚洲 | 免费看成人午夜福利专区 | 亚洲一区二区三区四区五区六 | 久久这里有精品国产电影网 | 99久久综合精品五月天 | 天天摸久久精品av | 亚欧精品在线观看 | 国产特级毛片aaaaaaa高清 | 美女视频一区 | 国产性自爱拍偷在在线播放 | 在线欧美 精品 第1页 | 男人的天堂色偷偷 | 国产福利网 | 日韩高清亚洲日韩精品一区 | 婷婷激情图片 | 亚洲精品无码伊人久久 | 亚洲欧美综合在线观看 | 久久精品亚洲一区二区三区浴池 | 99re6在线 | 黄色片在线视频 | 老司机av网站 | 欧美人与性动交α欧美片 | 欧美野性肉体狂欢大派对 | 国产欧美一区二区精品久导航 | 国产欧美一区二区三区四区五区 | 国产精品久久久久久久久免费桃花 | 无码av片在线观看免费 | 欧美做爰性生交视频 | 伊人高清| 91视频最新网址 | 国产亚洲精品久久久久久无 | 国产足控福利视频一区 | 日本一区二区视频在线 | 一二三四观看视频社区在线 | 深夜福利在线视频 | 佐々木あき在线中文字幕 | 亚洲全国最大的人成网站 | 成年人国产 | 国产精品久久久久久网站 | 少妇被粗大的猛烈进出va视频 | 亚洲精品一区二 | 98色花堂精品视频在线观看 | 欧美性猛交久久久乱大交小说 | 国产涩涩视频在线观看 | 青青青手机视频在线观看 | 丰满少妇理论片 | 色avav色av爱avav亚洲色拍 | 99精品国产自在现线10页 | 无码一区二区三区不卡av | 综合久久给合久久狠狠狠97色 | 成人女毛片视频免费播放 | 中文字幕在线观看日本 | 亚洲区欧美区 | 30岁少妇又紧又嫩 | 极品人妻少妇一区二区三区 | 国产在线伊人 | 青青青手机视频在线观看 | 国产午夜成人精品视频app | 欧美日韩在线不卡 | 亚洲综合精品一区 | 亚洲国产成人久久 | 全部毛片永久免费看 | 欧美成人网在线观看 | 成年女人色毛片 | 搡国产老太xxx网站 第一福利在线视频 | 少妇高潮惨叫久久麻豆传 | 国产精品岛国久久久久 | 国产区精品一区二区不卡中文 | 日韩成人精品视频 | 四虎网址在线 | 国产精品多人p群无码 | xxav在线| 日本不卡网站 | 国产精品一区二区三区四区 |