1. 程式人生 > 實用技巧 >淺析3個生僻但強大的JavaScript操作符

淺析3個生僻但強大的JavaScript操作符

  你有沒有花一個下午的時間來閱讀Mozilla的文件?如果你有,你就會很清楚,網上有很多關於JavaScript的資訊。這使得人們很容易忽視一些比較生僻的JavaScript操作符。然而,這些操作符不常見並不意味著它們不強大! 它們各自在語法上看起來很相似,但一定要讀懂每一個,因為它們的工作方式不同。就讓我們一探究竟吧!

1、?? 操作符

  在JavaScript中,??運算子被稱為nullish coalescing運算子(零合併操作符)。如果第一個引數不是null/undefined,這個運算子將返回第一個引數,否則,它將返回第二個引數。我們來看一個例子。

null ?? 5   // 5
3 ?? 5 // 3 0 ?? 5 // 0 // 與或的區別 0 || 5 // 5 null || 5 // 5

  當為一個變數分配預設值時,JavaScript開發人員傳統上依賴邏輯OR運算子,比如這樣。

'' ?? 5    // ""
'' || 5    // 5

  在上面的例子中,|| 操作符將 0及空 視為一個假值,因此會返回後面的預設值。

  但是實際情況下,我們還是需要僅僅當前面為 null或undefined 的時候,才取後面的值;當為 0或空 時,仍取前面的值。這個時候,我們使用nullish coalescing操作符就可以很好的解決這個問題。

  概括地說,??運算子允許我們分配預設值,同時忽略0和空字串等錯誤值。

2、??= 操作符

  ??=又被稱為邏輯空值賦值運算子,與我們之前學習的內容密切相關。我們來看看它們是如何聯絡在一起的。

var x = null;
var y = 5;
x ??= y;
x
// 5

var x = 3;
var y = 5;
x ??= y;
x
// 3
x ??= y
//
x = (x ?? y)

  這個賦值操作符只有在當前值為 null 或 未定義undefined 的情況下才會賦一個新的值。上面的例子強調了這個操作符本質上是空值賦值的語法糖。接下來,讓我們看看這個操作符與預設引數有何不同。

function gameSettingsWithNullish (options) {
    options.gameSpeed 
??= 1 options.gameDiff ??= 'easy' return options }
function gameSettingsWithDefaultParams (gameSpeed = 1, gameDiff = 'easy') {
    return {gameSpeed, gameDiff}
}
gameSettingsWithNullish({gameSpeed:null, gameSpeed:null})
// {gameSpeed: 1, gameDiff: "easy"}
gameSettingsWithNullish({})
// {gameSpeed: 1, gameDiff: "easy"}
gameSettingsWithDefaultParams(null, null) // {gameSpeed: null, gameDiff: null} gameSettingsWithDefaultParams() // {gameSpeed: 1, gameDiff: "easy"}
gameSettingsWithDefaultParams(undefined, undefined)
// {gameSpeed: 1, gameDiff: "easy"}
gameSettingsWithDefaultParams(0, 0)
// {gameSpeed: 0, gameDiff: 0}

3、?. 操作符

  可選的鏈式操作符 ?. 允許開發人員讀取深嵌在物件鏈中的屬性值,而不必顯式驗證每個引用。當一個引用為空時,表示式停止計算並返回一個未定義的值。讓我們來看看一個例子。

var travelPlans = {
  destination:'DC',
  monday:{
    location:'National Mall',
    budget:200
  }
}
var tuesdayPlans = travelPlans.tuesday.location;
// 報錯:VM4480:8 Uncaught TypeError: Cannot read property 'location' of undefined
    at <anonymous>:8:40

// 為防止報錯,我們通常這樣寫
var tuesdayPlans = travelPlans.tuesday && travelPlans.tuesday.location;
// undefined

  那麼現在我們就可以這樣寫

var tuesdayPlans = travelPlans.tuesday?.location;  // undefined

var travelPlans = {
  destination:'DC',
  monday:{
    location:'National Mall',
    budget:200
  },
  tuesday:{
    location:'test'
  }
}
travelPlans.tuesday?.location // "test"