可選鏈操作符是一個(gè)新的js api,它允許讀取一個(gè)被連接對(duì)象的深層次的屬性的值而無(wú)需明確校驗(yàn)鏈條上每一個(gè)引用的有效性。目前處于Stage 3提案階段,暫時(shí)不可以直接使用,可以通過(guò)babel編譯器使用。
可選鏈操作符(?.)
語(yǔ)法
obj?.prop
obj?.[expr]
func?.(args)
使用介紹
比如,我們有一個(gè)對(duì)象obj,現(xiàn)在要訪問(wèn)它的深層屬性baz。
const obj = {
foo: {
bar: {
baz: 42,
fun: ()=>{}
},
},
};
// 不使用?.
let baz = obj && obj.foo && obj.foo.bar && obj.foo.bar.baz;
// 使用?.
let baz = obj?.foo?.bar?.baz; // 結(jié)果:42
函數(shù)調(diào)用和表達(dá)式
// 函數(shù)調(diào)用
obj.fn?.()
// 表達(dá)式
obj?.['prop' + 'Name]
使用
我們可以通過(guò)babel編譯器來(lái)使用可以鏈操作符。
babel
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的話,你就需要安裝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ò)誤警告:

QQ截圖20191122173835.png
解決錯(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,
},
}
最后
愉快的使用?.操作符。