ES6 運算符的擴展

指數運算符

ES2016 新增了一個指數運算符(**)。

2 ** 2 // 4
2 ** 3 // 8

鏈判斷運算符

在寫代碼的時候,通常讀取對象內部的某個屬性,往往需要判斷一下,屬性的上層對象是否存在。比如,讀取 user.name 這個屬性,安全的寫法是寫成下面這樣。

// 如果不存在 user 對象將報錯
const  firstName = user.name || 'default';
// 正確的寫法
const firstName = (user && user.name) || 'default';

三元運算符 ?: 也常用於判斷對象是否存在。

const firstName = user ? user.name : 'default'

上面例子中,必須先判斷 user 是否存在,才能讀取 user.name。

這樣的層層判斷非常麻煩,因此 ES2020 引入了 “鏈判斷運算符” ?.,簡化上面的寫法。

const  firstName = user?.name || 'default';

上面代碼使用了?. 運算符,直接在鏈式調用的時候判斷,左側的對象是否爲 null 或 undefined。如果是的,就不再往下運算,而是返回 undefined。

下面是判斷對象方法是否存在,如果存在就立即執行的例子。

iterator.return?.()

上面代碼中,iterator.return 如果有定義,就會調用該方法,否則 iterator.return 直接返回 undefined,不再執行 ?. 後面的部分。

對於那些可能沒有實現的方法,這個運算符尤其有用。

本質上,?. 運算符相當於一種短路機制,只要不滿足條件,就不再往下執行。

Null 判斷運算符

讀取對象屬性的時候,如果某個屬性的值是 null 或 undefined,有時候需要爲它們指定默認值。常見做法是通過 || 運算符指定默認值。

const  firstName = user.name || 'default';

上面的代碼都通過 || 運算符指定默認值,但是這樣寫是錯的。開發者的原意是,只要屬性的值爲 null 或 undefined,默認值就會生效,但是屬性的值如果爲空字符串或 false 或 0 ,默認值也會生效。

爲了避免這種情況,ES2020 引入了一個新的 Null 判斷運算符 ??。它的行爲類似 ||,但是隻有運算符左側的值爲 null 或 undefined 時,纔會返回右側的值。

const  firstName = user.name ?? 'default';

上面代碼中,默認值只有在左側屬性值爲 null 或 undefined 時,纔會生效。

這個運算符的一個目的,就是跟鏈判斷運算符 ?. 配合使用,爲 null 或 undefined 的值設置默認值。

const  firstName = user?.name ?? 'default';

這個運算符很適合判斷函數參數是否賦值。

function Component(props) {
  props.enabled = props.enabled ?? true;
  // …
}

邏輯賦值運算符

ES2021 引入了三個新的邏輯賦值運算符,將邏輯運算符與賦值運算符進行結合。

// 或賦值運算符
x ||= y
// 等同於
x || (x = y)
// 與賦值運算符
x &&= y
// 等同於
x && (x = y)
// Null 賦值運算符
x ??= y
// 等同於
x ?? (x = y)

它們的一個用途是,爲變量或屬性設置默認值。

// 老的寫法
user.id = user.id || 1;
// 新的寫法
user.id ||= 1;

上面示例中,user.id 屬性如果不存在,則設爲 1,新的寫法比老的寫法更緊湊一些。

下面是另一個例子。

function Component(props) {
  props.enabled ??= true;
  // …
}

設置默認值非常便捷。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/v1hV9McchR60LlbT_C8Huw