为何对象属性作为参数索引时报错?用三元运算符则正常
问题原因及解决办法
先看能正常运行的三元表达式:
item?.unit ? item.unit:''
这里用了可选链操作符?.,如果item是null或者undefined,item?.unit会直接返回undefined,三元表达式就会返回空字符串,全程不会触发访问不存在属性的错误。就算item存在但unit属性不存在,同样会走返回空字符串的分支,不会报错。再看报错的语句:
point.sum = point.sum * conversionFactorArr[item.unit].conversionFactor;
这里有两个明确的报错诱因:- 如果
item是null/undefined,直接访问item.unit会抛出Cannot read properties of null/undefined的错误——你没给item加可选链做安全保护。 - 就算
item存在,item.unit的值可能是undefined、或者不是conversionFactorArr里的有效键,导致conversionFactorArr[item.unit]返回undefined,接着访问.conversionFactor就会抛出Cannot read properties of undefined的错误。
- 如果
对应的解决办法:
- 用可选链+默认值做安全处理,避免报错的同时保证乘法逻辑正常:
const factor = item?.unit ? conversionFactorArr[item.unit]?.conversionFactor || 1 : 1; point.sum = point.sum * factor; - 或者用完整的条件判断做前置检查:
if (item && item.unit && conversionFactorArr[item.unit]?.conversionFactor) { point.sum = point.sum * conversionFactorArr[item.unit].conversionFactor; }
- 用可选链+默认值做安全处理,避免报错的同时保证乘法逻辑正常:
内容的提问来源于stack exchange,提问作者cSharma
相关产品推荐
相关产品推荐

