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 的状态,再并用短路计算获取最终结果:
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, }, }
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整