1. 程式人生 > 程式設計 >js 可選鏈操作符的使用

js 可選鏈操作符的使用

前言

可選鏈操作符(?.)允許讀取位於連結物件鏈身處的屬性的值,而不必明確驗證鏈中的每個引用是否有效。不同之處在於,在引用為空(null或者undefined)的程式設計客棧情況下不會引起錯誤,該表示式短路返回值是undefined。與函式呼叫一起使用時,如果給定的函式不存在,則返回undefined。

當嘗試訪問可能不存在的物件屬性時,可選鏈操作符將會使表示式根更短、更簡明。在探索一個物件的內容時,如果不能確定哪些屬性必定存在,可選鏈操作符也是很有幫助的。

可選鏈操作符(?.)

語法

obj?.prop
obj?.[expr]
func?.(args)

描述

通過連線的物件的引用或函式可能是 undefined 或 null 時,可選鏈操作符提供了一種方法來簡化被連線物件的值訪問。
比如,思考一個存在巢狀結構的物件 obj。不使用可選鏈的話,查詢一個深度巢狀的子屬性時,需要驗證之間的引用,例如:

let nestedProp = obj.first && obj.first.second

為了避免報錯,在訪問obj.first.second之前,要保證 obj.first 的值既不是 null,也不是 undefined。如果只是直接訪問 obj.first.second,而不對 obj.first 進行校驗,則有可能丟擲錯誤。

有了可選鏈操作符(?.),在訪問 obj.first.second 之前,不再需要明確地校驗 obj.first 的狀態,再並用短路計算獲取最終結果:

lLGallHet nestedProp = obj.first?.second

通過使用 ?. 操作符取代 . 操作符,javascript 會在嘗試訪問 obj.first.second 之前,先隱式地檢查並確定 obj.first 既不是 null 也不是 undefined。如果obj.first 是 null 或者 undefined,表示式將會短路計算直接返回 undefined。

這等價於以下表達式,但實際上沒有建立臨時變數:

let temp = obj.first
let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second) 

使用

我們可以通過babel編譯器來使用可以鏈操作符。

babel

yarn add @babel/plugin-http://www.cppcns.comproposal-optional-chaining --dev

新增.babelrc檔案

{
  "plugins": ["@babel/plugin-proposal-optional-chaining"]
}

在create-react-app使用

預設情況下create-react-app,不允許修改babel配置,這裡我們需要安裝兩個附加模組以允許補充預設配置。

yarn add customize-cra react-app-rewired --dev

新增config-overrides.js檔案

const { useBabelRc,override } = require('customize-cra');
module.exports = override(useBabelRc());

修改package.json

"scripts": {
  "start": "react-app-rewired start","build": "react-app-rewired build","test": "react-app-rewired test --env=jsdom"
}

eslint

安裝babel編譯器後,就可以使用?.操作符了。但是如果你使用eslint的話,你就需要安裝babel-eslint來識別這種新語法。

yarn add babel-eslint --dev

新增.eslintrc檔案

{
  "parser": "babel-eslint","rules": {
    "strict": 0
  }
}

在vscode中使用

vscode的js驗證器目前並不能識別?.操作符,所以會有錯誤警告:

js 可選鏈操作符的使用

解決錯誤警告:

安裝vscode擴充套件ESLint,在擴充套件商店搜素並安裝ESLint。

修改vscode配置(.vscode/settings.json):

{
  "eslint.alwaysShowStatus": true,"eslint.autoFixOnSave": true,"javascript.validate.enable": false,// 主要是這個,關閉vscode的js驗證器
  "[javascript]": {
    "editor.formatOnSave": false,},LGallH"[javascriptreact]": {
  "ehttp://www.cppcns.comditor.formatOnSave": false,}

來源: 可選鏈操作符

到此這篇關於js 可選鏈操作符的使用的文章就介紹到這了,更多相關js 可選鏈操作符內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!