为何JavaScript无法访问对象userinfo中的auths属性?
问题分析与解决方法
这种情况我之前排查过好几次!核心原因大概率是auths这个属性被设置成了**不可枚举(non-enumerable)**状态,这就导致了几个看似矛盾的现象:
console.log(userinfo)能显示它:因为浏览器调试控制台会展示对象的所有自有属性,不管是否可枚举- 常规遍历(比如
for...in、Object.keys())找不到它:这类方法只会遍历可枚举属性 - 存成全局变量后能访问:Chrome调试工具将对象存为全局变量时,是直接引用原对象的属性,此时通过属性名直接访问不受枚举性限制(只要属性存在就能拿到)
验证方法
先确认属性的枚举状态,在控制台执行:
Object.getOwnPropertyDescriptor(userinfo, 'auths')
如果返回的结果里enumerable字段是false,那就坐实了是不可枚举的问题。
解决办法
1. 直接获取不可枚举属性的值
不需要修改原对象的话,用以下方法直接取值:
// 方法一:获取所有自有属性(含不可枚举) const authsValue = userinfo[Object.getOwnPropertyNames(userinfo).find(key => key === 'auths')]; // 方法二:用Reflect获取所有自有属性(含Symbol和不可枚举) const authsValue = userinfo[Reflect.ownKeys(userinfo).find(key => key === 'auths')];
2. 将属性改为可枚举(如果需要后续正常遍历)
如果希望auths能像其他属性一样被遍历,修改它的属性描述符:
const originDesc = Object.getOwnPropertyDescriptor(userinfo, 'auths'); Object.defineProperty(userinfo, 'auths', { enumerable: true, // 保留原属性的读写、配置权限,避免破坏原有行为 writable: originDesc.writable, configurable: originDesc.configurable });
修改后,for...in、Object.keys()就能正常遍历到auths了。
为什么会出现这种情况?
通常是代码中通过Object.defineProperty添加auths属性时,没有显式设置enumerable: true(该方法默认enumerable为false),而其他属性是通过直接赋值(比如userinfo.name = 'xxx')添加的,这类属性默认是可枚举的。也有可能是后端返回的对象经过某些库/框架处理后,被修改了属性的枚举状态。
内容的提问来源于stack exchange,提问作者桂小方
相关产品推荐
相关产品推荐

