JavaScript对象递归调用hasOwnProperty失败的原因及解决方法咨询
问题分析与解决办法
核心错误点
1. 原始类型无法添加自定义属性
你这段赋值代码存在本质问题:
const object = {}; object.property1 = 54; // 把property1设为数字(原始类型) object.property1.property1 = 60; // 无效操作
JS的原始类型(数字、字符串、布尔、null、undefined)不能直接添加自定义属性。当你尝试给数字54添加property1时,JS会临时把数字装箱成Number对象,但这个临时对象用完就会销毁,不会修改原来的数字值。所以最终object.property1还是54,根本不存在property1子属性。
2. hasOwnProperty的链式调用逻辑错误
你写的else if条件:
object.hasOwnProperty('property1').hasOwnProperty('property1')
hasOwnProperty方法的返回值是布尔值(true/false),你在布尔值后面链式调用hasOwnProperty,相当于在true或false上调用方法——这不仅逻辑完全错误(你本来想检查的是object.property1有没有子属性),还会触发错误(严格模式下),因为布尔值作为原始类型,直接调用方法会临时装箱,但它本身并没有你要检查的property1属性。
3. 直接访问深层属性的风险
你尝试的if(object.property1.property1)会返回undefined,是因为object.property1是数字54,数字没有property1属性,访问不存在的属性自然返回undefined,而undefined在条件判断中会被视为false,所以不会进入代码块。
解决步骤
第一步:修正对象结构(如果需要深层属性)
如果你确实需要object.property1拥有子属性,必须把object.property1定义为对象类型,而不是原始值:
const object = {}; object.property1 = { mainValue: 54 }; // 改为对象 object.property1.property1 = 60; // 现在这个赋值有效
第二步:正确的属性检查逻辑
方法一:分步检查(兼容所有JS环境)
先检查顶层属性是否存在,再检查子属性是否存在:
if (object.hasOwnProperty('property1')) { // 先确保顶层property1是对象/非原始类型(null也是object类型,要排除) const prop1 = object.property1; if (typeof prop1 === 'object' && prop1 !== null && prop1.hasOwnProperty('property1')) { // 处理object.property1.property1存在的情况 console.log('存在深层property1'); } else { // 处理只有顶层property1存在的情况 console.log('仅存在顶层property1'); } } else { // 处理顶层property1不存在的情况 console.log('顶层property1不存在'); }
方法二:可选链+空值合并(ES2020+,更简洁)
利用可选链?.避免深层访问报错,配合??判断是否存在:
if (object.property1?.property1 !== undefined) { // 深层property1存在 console.log('存在深层property1'); } else if (object.hasOwnProperty('property1')) { // 仅顶层property1存在 console.log('仅存在顶层property1'); } else { // 都不存在 console.log('顶层property1不存在'); }
内容的提问来源于stack exchange,提问作者user16570636
相关产品推荐
相关产品推荐

