亚洲一区在线播放-欧美另类极品videosbest使用方法-亚洲成人av在线播放-黄色录像大片-色悠悠av-91欧美日韩-中文字幕偷拍-综合色婷婷一区二区亚洲欧美国产-一级爱爱片-黑人添美女bbb添高潮了-久久青娱乐-黄色一级视屏-美女国产在线-亚洲九九九九-欧美 日韩 国产 成人 在线观看-星空大象mv高清在线观看免费-国产福利合集-好吊色视频在线观看-尤物综合网-18岁成年人网站

ES2020 系列:空值合并運算符 '??'

2020/10/27 10:04:30   閱讀:2607    發布者:2607

空值合并運算符 '??'

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

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

a ?? b 的結果是:

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

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

空值合并運算符并不是什么全新的東西。它只是一種獲得兩者中的第一個已定義的值的不錯的語法。

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

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

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

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

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

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

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

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

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

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

讓我們使用?? 運算符來實現這一需求:

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

|| 比較

或運算符|| 可以以與?? 運算符相同的方式使用。

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

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

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

另一方面,空值合并運算符?? 是最近才被添加到 JavaScript 中的,它的出現是因為人們對|| 不太滿意。

它們之間重要的區別是:

  • || 返回第一個 值。
  • ?? 返回第一個 已定義的 值。

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

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

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

let height = 0;
alert(height || 100); // 100
alert(height ?? 100); // 0
  • height || 100 首先會檢查height 是否為一個假值,發現它確實是。
    • 所以,結果為第二個參數,100。
  • height ?? 100 首先會檢查height 是否為null/undefined,發現它不是。
    • 所以,結果為height 的原始值,0。

如果高度0 為有效值,則不應將其替換為默認值,所以?? 能夠得出正確的結果。

優先級

?? 運算符的優先級相當低:在 MDN table 中為5。因此,?? = ? 之前計算,但在大多數其他運算符(例如,+ *)之后計算。

因此,如果我們需要在還有其他運算符的表達式中使用?? 進行取值,需要考慮加括號:

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

否則,如果我們省略了括號,則由于* 的優先級比?? 高,它會先執行,進而導致錯誤的結果。

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

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

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

下面的代碼會觸發一個語法錯誤:

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

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

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

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

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

主站蜘蛛池模板: 91av色| 九九午夜 | 欧美性受xxxx黑人xyx性爽 | 婷婷超碰 | 精品欧美乱码久久久久久1区2区 | 精品黑人一区二区三区久久 | 国产又爽又黄无码无遮挡在线观看 | 欧美亚洲精品天堂 | 亚洲中文无码久久 | 神马午夜嘿嘿 | 欧美图片一区二区 | 免费av不卡| 国产精品欧美激情 | 三级艳丽杨钰莹三级 | 成人av动漫| 婷婷国产成人精品视频 | 欧美天天影院 | 黄网站在线免费看 | 激情五月婷婷综合网 | av免费精品 | 色人阁五月天 | 成人午夜网站 | 欧美久久一级 | 日本黄色成人 | 色综合五月婷婷 | 午夜伦理视频 | 国产精品久久久久久久久久久免费看 | 久久精品综合视频 | 欧美日韩国产一区二区在线观看 | 91丝袜美腿 | 国产精品99久 | 天堂男人av | 西西午夜影院 | aa在线视频 | 久久精品久久久精品美女 | 亚洲一二三在线 | 日韩激情小说 | 国产精选久久 | 男人天堂成人网 | 真人真事免费毛片 | 日本在线h| 亚洲精品人 | 成人午夜视频免费观看 | 3d动漫精品啪啪一区二区免费 | 午夜电影一区二区 | 亚洲va天堂va欧美ⅴa在线 | 日日色综合 | 欧美成人免费 | 麻豆出品 | 免费在线观看日韩av | 亚洲视频图片小说 | 色偷偷资源网 | 好色艳妇小说 | 伊人毛片 | 9999久久久久 | 黄骗免费网站 | 一级黄色片网站 | 爆操91| 日本理论片午伦夜理片在线观看 | 成年人免费在线视频 | 欧美人与性禽动交精品 | 国产精品一区二区三区免费 | 拍摄av现场失控高潮数次 | 超碰免费成人 | 美女aaa | 国内av| 欧美怡红院视频 | 这里只有精品免费视频 | 偷偷久久| 国产亚洲第一页 | 人妻丰满熟妇av无码久久洗澡 | 日韩精品影院 | 不用播放器的av网站 | 国产女人毛片 | 精品中出 | 欧美人与zoxxxx另类 | 热re99久久精品国产99热 | 尹人香蕉 | 91欧美在线 | 无码国产精品一区二区高潮 | 免费a级片视频 | 邻居校草天天肉我h1v1 | 成年网站免费在线观看 | 快播视频在线观看 | www.日 | 日韩精品电影一区二区 | 国产精品精品国产色婷婷 | 亚洲成人系列 | 在线日韩成人 | 欧美一区,二区 | 91porn在线 | 日本午夜一区二区 | 久久综合久久鬼色 | 国产孕妇一区二区三区 | 日韩爱爱爱 | av动漫天堂| 欧美一区二区在线 | 免费污视频 | 西方av在线 |