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 的狀態,再並用短路計算獲取最終結果:
let 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-proposal-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驗證器目前並不能識別?.操作符,所以會有錯誤警告:
解決錯誤警告:
安裝vscode擴展ESLint,在擴展商店搜素並安裝ESLint。
修改vscode配置(.vscode/settings.json):
{ "eslint.alwaysShowStatus": true, "eslint.autoFixOnSave": true, "javascript.validate.enable": false, // 主要是這個,關閉vscode的js驗證器 "[javascript]": { "editor.formatOnSave": false, }, "[javascriptreact]": { "editor.formatOnSave": false, }, }
來源: 可選鏈操作符
到此這篇關於js 可選鏈操作符的使用的文章就介紹到這瞭,更多相關js 可選鏈操作符內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- VSCode中 Eslint 和 Prettier 沖突問題最新解決方法
- vue項目的創建的步驟(圖文教程)
- 詳解React項目中eslint使用百度風格
- vscode 配置eslint和prettier正確方法
- 教你使用vscode 搭建react-native開發環境