JavaScript设置对象属性异常:缺失属性未触发catch块问题排查
问题根源:访问不存在的对象属性不会抛出异常
你遇到的核心问题是:当对象不存在某个属性时,访问它并不会抛出错误,只会返回undefined。所以你的try块里的代码全程没有触发异常,catch逻辑完全不会执行,自然也就不会把y.size设为null。
我们拆解下x = {}时的执行流程:
- 访问
x.size返回undefined(无错误,try块继续) parseFloat(undefined)返回NaN(这也属于合法返回值,不会抛错)- 三目运算符判断
NaN为假值,执行${x.size}——如果你的代码确实是模板字符串,这里会得到字符串"undefined";如果是笔误没加反引号,就会直接赋值undefined。但不管哪种情况,全程没有异常,catch块根本不会被触发。
修复方案
你可以用两种思路实现需求:
方案1:主动检查属性,不依赖try/catch
这是更高效的写法,因为try/catch适合处理不可预见的错误,而属性缺失是可以提前判断的:
let x = {} let y = { 'size': null } // 检查x是否包含size属性,且属性值不为null/undefined if ('size' in x && x.size != null) { // 优化:避免重复调用parseFloat const parsed = parseFloat(x.size); y.size = !isNaN(parsed) ? `${parsed}` : `${x.size}`; } else { y.size = null; } console.log(y) // 输出 { size: null }
这里'size' in x确保x本身有这个属性,x.size != null同时排除null和undefined的情况;另外我优化了重复调用parseFloat的问题,避免冗余计算。
方案2:主动抛错,触发catch块
如果你一定要保留try/catch的写法,可以主动在属性缺失时抛出错误:
let x = {} let y = { 'size': null } try { if (!('size' in x)) { throw new Error('size属性缺失'); } const parsed = parseFloat(x.size); y.size = !isNaN(parsed) ? `${parsed}` : `${x.size}`; } catch (e) { console.log("yes") y.size = null; } console.log(y) // 输出 { size: null }
这样当x没有size属性时,主动抛出的错误会触发catch块,执行你期望的逻辑。
额外提一句:你原代码的三目运算逻辑有个小细节——如果x.size是0,parseFloat(x.size)返回0(假值),会走${x.size}转成字符串"0",这其实是符合预期的;但如果x.size是null,parseFloat(null)返回NaN,也会走模板字符串转成"null",如果希望这类情况也设为null,可以把判断条件改成!isNaN(parsed),就像我上面代码里写的那样。
内容的提问来源于stack exchange,提问作者Tenzolinho
相关产品推荐
相关产品推荐

