For循环中忽略TypeError并为不存在属性设置空值或默认值的实现方法
方案1:使用可选链+空值合并运算符(最简实现)
这是ES2020之后支持的语法,不需要try/catch就能同时处理「上级对象为空抛TypeError」和「属性不存在返回undefined」两种场景,直接赋值自定义默认值:
for (var i = 0; i < theObj.length; i++) { // 右侧引号里的内容可以替换成你要的自定义值,比如null、'N/A'、'DNE'等 const levels = theObj[i]?.level ?? '' console.log(levels) }
语法说明:
- 可选链
?.:如果theObj[i]为null/undefined,会直接返回undefined,不会抛出TypeError - 空值合并运算符
??:只有左侧值为null/undefined时才会返回右侧的默认值,不会覆盖0、false、空字符串这类合法的属性值
方案2:try/catch 实现(符合你原始要求的写法)
你当前的测试场景中,访问对象不存在的属性只会返回undefined,不会触发TypeError;只有当要访问属性的上级对象本身是null/undefined时(比如数组越界取到不存在的元素)才会抛出类型错误,完整写法如下:
for (var i = 0; i < theObj.length; i++) { // 提前声明变量并赋值默认兜底值 let levels = '' try { const currentLevel = theObj[i]['level'] // 若属性值不为undefined则覆盖默认值,不需要该判断可直接写levels = theObj[i]['level'] if (currentLevel !== undefined) { levels = currentLevel } } catch (error) { // 捕获到TypeError时直接用提前声明的默认值即可,也可在这里重新赋值自定义标识 // levels = 'DNE' } console.log(levels) }
旧环境兼容写法
如果运行环境不支持ES2020新语法,可以用逻辑与判断实现同等效果:
for (var i = 0; i < theObj.length; i++) { const levels = (theObj[i] && theObj[i].level !== undefined) ? theObj[i].level : '' console.log(levels) }
以上三种方案运行后都能得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者doppis
相关产品推荐
相关产品推荐

