简单来说,?.(可选链)会先执行,然后才是 !(逻辑非)。
这个表达式 !contractList?.length 的执行过程可以拆解为两步:
1. 第一步:执行 contractList?.length
?. 是可选链操作符。它的作用是安全地访问属性。
- 如果
contractList是null或undefined,它会直接停止并返回undefined。 - 如果
contractList是一个数组,它会返回数组的长度(比如0,1,2...)。
2. 第二步:执行 !
! 是逻辑非操作符。它会将前面的结果转换成布尔值并取反。
- 如果第一步结果是
undefined(即原数据是null/undefined):!undefined➜true - 如果第一步结果是
0(即原数据是空数组[]):!0➜true - 如果第一步结果是
3(即原数据是有3个元素的数组):!3➜false
总结
所以 !contractList?.length 这句代码翻译成白话就是:
“如果 contractList 不存在,或者它的长度为 0,那么...”
它完美覆盖了我们想要判断的所有“无数据”场景:
undefined(没传) ➜truenull(空值) ➜true[](空数组) ➜true