Js中? ?和? .

Js中??和?.和 ||

空值合并操作符 ??

只有当左侧为null或者undefined的时候才输出右侧的值

逻辑或操作符 ||

左侧的值为假值的时候就输出右侧的数

假值:
null undefined '' 0
例子:
console.log(null ?? 'ss')   // 输出ss
console.log(undefined ?? 'ss')   // 输出ss
console.log(0 ?? 'ss')   // 输出0
console.log(0 || 'ss')   // 输出ss

可选链操作符 ?.

允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。

?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空(nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值

const adventurer = {
  name: 'Alice',
  cat: {
    name: 'Dinah'
  }
};

const dogName = adventurer.dog?.name;
console.log(dogName); // undefined
console.log(adventurer.someNonExistentMethod?.()); //undefined
空值合并操作符可以在使用可选链时设置一个默认值:

let a = {
  name: "Carl",
  details: { age: 82 }
};

let aCity = a?.city ?? "城市";
console.log(aCity);  // “城市”
Access to XMLHttpRequest at 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=N9wuQ3hiC5gYFmWjPfblib1x&client_secret=ZwW8cTKNO0nISPsT35WX5u2c0tZP2e6R' from origin 'http://192.168.2.53:5173' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. voice2text.vue:95 获取 Access Token 失败: {errMsg: "request:fail"} fail @ voice2text.vue:95 (anonymous) @ uni-h5.es.js? [sm]:2712 (anonymous) @ uni-h5.es.js? [sm]:2809 invokeCallback @ uni-h5.es.js? [sm]:2735 invokeFail @ uni-h5.es.js? [sm]:2992 reject @ uni-h5.es.js? [sm]:3068 xhr.onerror @ uni-h5.es.js? [sm]:20541 error (async) (anonymous) @ uni-h5.es.js? [sm]:20539 (anonymous) @ uni-h5.es.js? [sm]:3066 invokeApi @ uni-h5.es.js? [sm]:2917 (anonymous) @ uni-h5.es.js? [sm]:2933 getAccessToken @ voice2text.vue:85 created @ voice2text.vue:65 callWithErrorHandling @ vue.runtime.esm.js? [sm]:1418 callWithAsyncErrorHandling @ vue.runtime.esm.js? [sm]:1425 callHook$1 @ vue.runtime.esm.js? [sm]:4969 applyOptions @ vue.runtime.esm.js? [sm]:4884 finishComponentSetup @ vue.runtime.esm.js? [sm]:9089 handleSetupResult @ vue.runtime.esm.js? [sm]:9040 setupStatefulComponent @ vue.runtime.esm.js? [sm]:9009 setupComponent @ vue.runtime.esm.js? [sm]:8941 mountComponent @ vue.runtime.esm.js? [sm]:7265 processComponent @ vue.runtime.esm.js? [sm]:7231 patch @ vue.runtime.esm.js? [sm]:6699 componentUpdateFn @ vue.runtime.esm.js? [sm]:7456 run @ vue.runtime.esm.js? [sm]:180 instance.update @ vue.runtime.esm.js? [sm]:7500 callWithErrorHandling @ vue.runtime.esm.js? [sm]:1418 flushJobs @ vue.runtime.esm.js? [sm]:1623 Promise.then (async) queueFlush @ vue.runtime.esm.js? [sm]:1532 queueJob @ vue.runtime.esm.js? [sm]:1526 (anonymous) @ vue.runtime.esm.js? [sm]:7494 resetScheduling @ vue.runtime.esm.js? [sm]:263 triggerEffects @ vue.runtime.esm.js? [sm]:307 triggerRefValue @ vue.runtime.esm.js? [sm]:1067 set value @ vue.runtime.esm.js? [sm]:1112 (anonymous) @ vue.runtime.esm.js? [sm]:3805 Promise.then (async) setup @ vue.runtime.esm.js? [sm]:3804 callWithErrorHandling @ vue.runtime.esm.js? [sm]:1418 setupStatefulComponent @ vue.runtime.esm.js? [sm]:8980 setupComponent @ vue.runtime.esm.js? [sm]:8941 mountComponent @ vue.runtime.esm.js? [sm]:7265 processComponent @ vue.runtime.esm.js? [sm]:7231 patch @ vue.runtime.esm.js? [sm]:6699 mountChildren @ vue.runtime.esm.js? [sm]:6947 processFragment @ vue.runtime.esm.js? [sm]:7161 patch @ vue.runtime.esm.js? [sm]:6673 mountChildren @ vue.runtime.esm.js? [sm]:6947 processFragment @ vue.runtime.esm.js? [sm]:7161 patch @ vue.runtime.esm.js? [sm]:6673 mountChildren @ vue.runtime.esm.js? [sm]:6947 mountElement @ vue.runtime.esm.js? [sm]:6854 processElement @ vue.runtime.esm.js? [sm]:6819 patch @ vue.runtime.esm.js? [sm]:6687 mountChildren @ vue.runtime.esm.js? [sm]:6947 mountElement @ vue.runtime.esm.js? [sm]:6854 processElement @ vue.runtime.esm.js? [sm]:6819 patch @ vue.runtime.esm.js? [sm]:6687 mountChildren @ vue.runtime.esm.js? [sm]:6947 processFragment @ vue.runtime.esm.js? [sm]:7161 patch @ vue.runtime.esm.js? [sm]:6673 componentUpdateFn @ vue.runtime.esm.js? [sm]:7375 run @ vue.runtime.esm.js? [sm]:180 instance.update @ vue.runtime.esm.js? [sm]:7500 setupRenderEffect @ vue.runtime.esm.js? [sm]:7510 mountComponent @ vue.runtime.esm.js? [sm]:7277 processComponent @ vue.runtime.esm.js? [sm]:7231 patch @ vue.runtime.esm.js? [sm]:6699 mountChildren @ vue.runtime.esm.js? [sm]:6947 mountElement @ vue.runtime.esm.js? [sm]:6854 processElement @ vue.runtime.esm.js? [sm]:6819 patch @ vue.runtime.esm.js? [sm]:6687 componentUpdateFn @ vue.runtime.esm.js? [sm]:7375 run @ vue.runtime.esm.js? [sm]:180 instance.update @ vue.runtime.esm.js? [sm]:7500 setupRenderEffect @ vue.runtime.esm.js? [sm]:7510 mountComponent @ vue.runtime.esm.js? [sm]:7277 processComponent @ vue.runtime.esm.js? [sm]:7231 patch @ vue.runtime.esm.js? [sm]:6699 componentUpdateFn @ vue.runtime.esm.js? [sm]:7375 run @ vue.runtime.esm.js? [sm]:180 instance.update @ vue.runtime.esm.js? [sm]:7500 setupRenderEffect @ vue.runtime.esm.js? [sm]:7510 mountComponent @ vue.runtime.esm.js? [sm]:7277 processComponent @ vue.runtime.esm.js? [sm]:7231 patch @ vue.runtime.esm.js? [sm]:6699 componentUpdateFn @ vue.runtime.esm.js? [sm]:7456 run @ vue.runtime.esm.js? [sm]:180 instance.update @ vue.runtime.esm.js? [sm]:7500 updateComponent @ vue.runtime.esm.js? [sm]:7308 processComponent @ vue.runtime.esm.js? [sm]:7242 patch @ vue.runtime.esm.js? [sm]:6699 componentUpdateFn @ vue.runtime.esm.js? [sm]:7456 run @ vue.runtime.esm.js? [sm]:180 instance.update @ vue.runtime.esm.js? [sm]:7500 callWithErrorHandling @ vue.runtime.esm.js? [sm]:1418 flushJobs @ vue.runtime.esm.js? [sm]:1623 Promise.then (async) queueFlush @ vue.runtime.esm.js? [sm]:1532 queueJob @ vue.runtime.esm.js? [sm]:1526 scheduler @ vue.runtime.esm.js? [sm]:3219 resetScheduling @ vue.runtime.esm.js? [sm]:263 triggerEffects @ vue.runtime.esm.js? [sm]:307 triggerRefValue @ vue.runtime.esm.js? [sm]:1067 set value @ vue.runtime.esm.js? [sm]:1112 finalizeNavigation @ vue-router.mjs?v=7c818844? [sm]:3361 (anonymous) @ vue-router.mjs?v=7c818844? [sm]:3226 Promise.then (async) pushWithRedirect @ vue-router.mjs?v=7c818844? [sm]:3193 push @ vue-router.mjs?v=7c818844? [sm]:3118 install @ vue-router.mjs?v=7c818844? [sm]:3559 use @ vue.runtime.esm.js? [sm]:5200 initRouter @ uni-h5.es.js? [sm]:16231 install @ uni-h5.es.js? [sm]:16300 use @ vue.runtime.esm.js? [sm]:5200 (anonymous) @ main.js:22 Show 60 more frames uni-h5.es.js? [sm]:20544 POST https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=N9wuQ3hiC5gYFmWjPfblib1x&client_secret=ZwW8cTKNO0nISPsT35WX5u2c0tZP2e6R net::ERR_FAILED
09-24
代码报错如下:报错如下,请修改代码:vue.runtime.esm.js?2b0e:619 [Vue warn]: Cannot set reactive property on undefined, null, or primitive value: NULL warn @ vue.runtime.esm.js?2b0e:619 set @ vue.runtime.esm.js?2b0e:1069 callback @ Autoreposition.vue?b778:754 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2175 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 Vue.$emit @ vue.runtime.esm.js?2b0e:3888 fireChange @ Select.js?43a6:1109 onMenuSelect @ Select.js?43a6:460 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ Menu.js?313c:68 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ SubPopupMenu.js?1462:194 click @ SubPopupMenu.js?1462:313 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ MenuItem.js?528d:115 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 original._wrapper @ vue.runtime.esm.js?2b0e:6917 vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in v-on handler: "TypeError: Cannot use 'in' operator to search for 'handleMode' in NULL" found in ---> <ASelect> <TableCell> <BodyRow> <TableRow> <ConnectTableRow> <ProxyConnectTableRow> <ExpandableRow> <ConnectExpandableRow> <ProxyConnectExpandableRow> <BaseTable> <ConnectBaseTable> <ProxyConnectBaseTable> <BodyTable> <ExpandableTable> <ConnectExpandableTable> <ProxyConnectExpandableTable> <StoreProvider> <Table> <Table> <LocaleReceiver> <ASpin> <Table> <ATable> <ACard>... (1 recursive calls) <AFormModel> <Process> <PageToggleTransition> at src/components/transition/PageToggleTransition.vue <Anonymous> <ALayoutContent> <Anonymous> <ALayout> <Anonymous> <ALayout> <AdminLayout> at src/layouts/AdminLayout.vue <TabsView> at src/layouts/tabs/TabsView.vue <ALocaleProvider> <LocaleReceiver> <AConfigProvider> <App> at src/App.vue <Root> warn @ vue.runtime.esm.js?2b0e:619 logError @ vue.runtime.esm.js?2b0e:1884 globalHandleError @ vue.runtime.esm.js?2b0e:1879 handleError @ vue.runtime.esm.js?2b0e:1839 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1862 invoker @ vue.runtime.esm.js?2b0e:2175 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 Vue.$emit @ vue.runtime.esm.js?2b0e:3888 fireChange @ Select.js?43a6:1109 onMenuSelect @ Select.js?43a6:460 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ Menu.js?313c:68 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ SubPopupMenu.js?1462:194 click @ SubPopupMenu.js?1462:313 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ MenuItem.js?528d:115 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 original._wrapper @ vue.runtime.esm.js?2b0e:6917 vue.runtime.esm.js?2b0e:1888 TypeError: Cannot use 'in' operator to search for 'handleMode' in NULL at Proxy.set (vue.runtime.esm.js?2b0e:1076) at callback (Autoreposition.vue?b778:754) at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854) at VueComponent.invoker (vue.runtime.esm.js?2b0e:2175) at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854) at VueComponent.Vue.$emit (vue.runtime.esm.js?2b0e:3888) at VueComponent.fireChange (Select.js?43a6:1109) at VueComponent.onMenuSelect (Select.js?43a6:460) at invokeWithErrorHandling (vue.runtime.esm.js?2b0e:1854) at invoker (vue.runtime.esm.js?2b0e:2179) logError @ vue.runtime.esm.js?2b0e:1888 globalHandleError @ vue.runtime.esm.js?2b0e:1879 handleError @ vue.runtime.esm.js?2b0e:1839 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1862 invoker @ vue.runtime.esm.js?2b0e:2175 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 Vue.$emit @ vue.runtime.esm.js?2b0e:3888 fireChange @ Select.js?43a6:1109 onMenuSelect @ Select.js?43a6:460 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ Menu.js?313c:68 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ SubPopupMenu.js?1462:194 click @ SubPopupMenu.js?1462:313 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 __emit @ BaseMixin.js?b488:37 onClick @ MenuItem.js?528d:115 invokeWithErrorHandling @ vue.runtime.esm.js?2b0e:1854 invoker @ vue.runtime.esm.js?2b0e:2179 original._wrapper @ vue.runtime.esm.js?2b0e:6917 Autoreposition.vue?bbec:1268 Handle Mode changed: {ob: Observer}
最新发布
11-13
这段代码主要是根据条件对 `curAggr` 对象中的 `data.inspirationTheme.homeWallpaperStyle.homeCheckBoxInitIndex` 属性进行赋值操作,以下是详细解释: ### 代码功能概述 代码通过两个条件判断来更新 `curAggr` 对象的特定属性,主要涉及到 `otherAggr` `curAggr` 对象中的 `data.inspirationTheme.homeWallpaperStyle.homeCheckBoxInitIndex` 属性,以及常量 `WALLPAPER_CHOOSE_TYPE_FLOW` `WALLPAPER_CHOOSE_TYPE_WALLPAPER`。 ### 代码详细解释 ```javascript // 第一个条件判断 if (otherAggr?.data?.inspirationTheme?.homeWallpaperStyle?.homeCheckBoxInitIndex != WALLPAPER_CHOOSE_TYPE_FLOW) { // 如果 otherAggr 中的 homeCheckBoxInitIndex 不等于 WALLPAPER_CHOOSE_TYPE_FLOW // 则将 curAggr 中的 homeCheckBoxInitIndex 设置为 otherAggr 中的 homeCheckBoxInitIndex // 如果 otherAggr 中的 homeCheckBoxInitIndex 为 null 或 undefined,则设置为 0 curAggr?.data?.inspirationTheme?.homeWallpaperStyle?.homeCheckBoxInitIndex = otherAggr?.data?.inspirationTheme?.homeWallpaperStyle?.homeCheckBoxInitIndex ?: 0; } // 第二个条件判断 else if (curAggr?.data?.inspirationTheme?.homeWallpaperStyle?.homeCheckBoxInitIndex != WALLPAPER_CHOOSE_TYPE_FLOW) { // 如果第一个条件不满足,且 curAggr 中的 homeCheckBoxInitIndex 不等于 WALLPAPER_CHOOSE_TYPE_FLOW // 则将 curAggr 中的 homeCheckBoxInitIndex 设置为 WALLPAPER_CHOOSE_TYPE_WALLPAPER curAggr?.data?.inspirationTheme?.homeWallpaperStyle?.homeCheckBoxInitIndex = WALLPAPER_CHOOSE_TYPE_WALLPAPER; } ``` ### 代码逻辑总结 1. 首先检查 `otherAggr` 对象中的 `homeCheckBoxInitIndex` 是否不等于 `WALLPAPER_CHOOSE_TYPE_FLOW`。 - 如果是,则将 `curAggr` 对象中的 `homeCheckBoxInitIndex` 设置为 `otherAggr` 对象中的 `homeCheckBoxInitIndex`,若 `otherAggr` 中的该属性为 `null` 或 `undefined`,则设置为 `0`。 2. 如果第一个条件不满足,接着检查 `curAggr` 对象中的 `homeCheckBoxInitIndex` 是否不等于 `WALLPAPER_CHOOSE_TYPE_FLOW`。 - 如果是,则将 `curAggr` 对象中的 `homeCheckBoxInitIndex` 设置为 `WALLPAPER_CHOOSE_TYPE_WALLPAPER`。 ### 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值