js 可選鏈操作符的使用
前言
可選鏈操作符(?.)允許讀取位于鏈接對(duì)象鏈身處的屬性的值,而不必明確驗(yàn)證鏈中的每個(gè)引用是否有效。不同之處在于,在引用為空(null或者undefined)的情況下不會(huì)引起錯(cuò)誤,該表達(dá)式短路返回值是undefined。與函數(shù)調(diào)用一起使用時(shí),如果給定的函數(shù)不存在,則返回undefined。
當(dāng)嘗試訪(fǎng)問(wèn)可能不存在的對(duì)象屬性時(shí),可選鏈操作符將會(huì)使表達(dá)式根更短、更簡(jiǎn)明。在探索一個(gè)對(duì)象的內(nèi)容時(shí),如果不能確定哪些屬性必定存在,可選鏈操作符也是很有幫助的。
可選鏈操作符(?.)
語(yǔ)法
obj?.prop obj?.[expr] func?.(args)
描述
通過(guò)連接的對(duì)象的引用或函數(shù)可能是 undefined 或 null 時(shí),可選鏈操作符提供了一種方法來(lái)簡(jiǎn)化被連接對(duì)象的值訪(fǎng)問(wèn)。
比如,思考一個(gè)存在嵌套結(jié)構(gòu)的對(duì)象 obj。不使用可選鏈的話(huà),查找一個(gè)深度嵌套的子屬性時(shí),需要驗(yàn)證之間的引用,例如:
let nestedProp = obj.first && obj.first.second
為了避免報(bào)錯(cuò),在訪(fǎng)問(wèn)obj.first.second之前,要保證 obj.first 的值既不是 null,也不是 undefined。如果只是直接訪(fǎng)問(wèn) obj.first.second,而不對(duì) obj.first 進(jìn)行校驗(yàn),則有可能拋出錯(cuò)誤。
有了可選鏈操作符(?.),在訪(fǎng)問(wèn) obj.first.second 之前,不再需要明確地校驗(yàn) obj.first 的狀態(tài),再并用短路計(jì)算獲取最終結(jié)果:
let nestedProp = obj.first?.second
通過(guò)使用 ?. 操作符取代 . 操作符,JavaScript 會(huì)在嘗試訪(fǎng)問(wèn) obj.first.second 之前,先隱式地檢查并確定 obj.first 既不是 null 也不是 undefined。如果obj.first 是 null 或者 undefined,表達(dá)式將會(huì)短路計(jì)算直接返回 undefined。
這等價(jià)于以下表達(dá)式,但實(shí)際上沒(méi)有創(chuàng)建臨時(shí)變量:
let temp = obj.first let nestedProp = ((temp === null || temp === undefined) ? undefined : temp.second)
使用
我們可以通過(guò)babel編譯器來(lái)使用可以鏈操作符。
yarn add @babel/plugin-proposal-optional-chaining --dev
添加.babelrc文件
{ "plugins": ["@babel/plugin-proposal-optional-chaining"] }
在create-react-app使用
默認(rèn)情況下create-react-app,不允許修改babel配置,這里我們需要安裝兩個(gè)附加模塊以允許補(bǔ)充默認(rèn)配置。
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的話(huà),你就需要安裝babel-eslint來(lái)識(shí)別這種新語(yǔ)法。
yarn add babel-eslint --dev
添加.eslintrc文件
{ "parser": "babel-eslint", "rules": { "strict": 0 } }
在vscode中使用
vscode的js驗(yàn)證器目前并不能識(shí)別?.操作符,所以會(huì)有錯(cuò)誤警告:
解決錯(cuò)誤警告:
安裝vscode擴(kuò)展ESLint,在擴(kuò)展商店搜素并安裝ESLint。
修改vscode配置(.vscode/settings.json):
{ "eslint.alwaysShowStatus": true, "eslint.autoFixOnSave": true, "javascript.validate.enable": false, // 主要是這個(gè),關(guān)閉vscode的js驗(yàn)證器 "[javascript]": { "editor.formatOnSave": false, }, "[javascriptreact]": { "editor.formatOnSave": false, }, }
來(lái)源: 可選鏈操作符
到此這篇關(guān)于js 可選鏈操作符的使用的文章就介紹到這了,更多相關(guān)js 可選鏈操作符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js與jQuery實(shí)現(xiàn)獲取table中的數(shù)據(jù)并拼成json字符串操作示例
這篇文章主要介紹了js與jQuery實(shí)現(xiàn)獲取table中的數(shù)據(jù)并拼成json字符串操作,涉及javascript與jQuery針對(duì)HTML頁(yè)面table表格數(shù)據(jù)獲取、遍歷及json字符串拼接相關(guān)操作技巧,需要的朋友可以參考下2018-07-07opencv 識(shí)別微信登錄驗(yàn)證滑動(dòng)塊位置
這篇文章主要介紹了opencv 識(shí)別微信登錄驗(yàn)證滑動(dòng)塊位置及各自的優(yōu)缺點(diǎn),需要的朋友可以參考下2018-08-08JavaScript自動(dòng)內(nèi)存管理與垃圾回收策略詳細(xì)分析講解
JS的垃圾回收機(jī)制是為了以防內(nèi)存泄漏,內(nèi)存泄漏的含義就是當(dāng)已經(jīng)不需要某塊內(nèi)存時(shí)這塊內(nèi)存還存在著,垃圾回收機(jī)制就是間歇的不定期的尋找到不再使用的變量,并釋放掉它們所指向的內(nèi)存。因?yàn)閮?nèi)存的大小是有限的,所以當(dāng)內(nèi)存不再需要的時(shí)候,我們需要對(duì)其進(jìn)行釋放2023-01-01Google Map Api和GOOGLE Search Api整合實(shí)現(xiàn)代碼
將GOOGLE MAP API 和 GOOGLE Search API 進(jìn)行整合,我用面向?qū)ο蟮姆绞綄?xiě)了一個(gè)類(lèi),通過(guò)傳一個(gè)經(jīng)緯度進(jìn)去,自動(dòng)通過(guò)GOOGLE LOCAL SEARCH獲取附近的相關(guān)信息。比如餐廳、景點(diǎn)等,反過(guò)來(lái)標(biāo)到地圖上,并可在任意容器內(nèi)顯示。2009-07-07