首页 > 网页制作 >用Reflect.ownKeys和数组过滤精准销毁对象敏感私有属性

用Reflect.ownKeys和数组过滤精准销毁对象敏感私有属性

来源:互联网 2026-07-03 08:17:01

通过反射机制获取对象所有自身属性键(包括不可枚举和符号键),利用数组定义的黑名单或白名单,逐个遍历这些键并执行删除操作或将其赋值为未定义,从而实现敏感属性的精准销毁,并支持对不可配置属性进行降级处理。

需要先明确:Reflect.ownKeys 本身并不负责删除属性,它的作用是枚举对象自身所有键——包括不可枚举的和 Symbol 键。真正执行删除操作的是 delete 操作符,或者将属性值赋为 undefined。而数组过滤在此扮演的是声明者角色:通过白名单或黑名单定义敏感字段,再借助 Reflect.ownKeys 获取全部自有键,进行交集或排除,从而精准定位并清理目标属性。

下面逐步拆解这个流程。

长期稳定更新的攒劲资源: >>>点此立即查看<<<

明确敏感字段列表,用数组定义白名单或黑名单

第一步,整理需要销毁的敏感属性名。常见的如 "password""token""idCard",甚至可能是某个 Symbol("session")。将这些名称存储为字符串或 Symbol 类型的数组。注意:Symbol 键必须使用原始的 Symbol 实例,不能用 Symbol("xxx") 临时生成,因为每次调用都会创建新的 Symbol,无法匹配。

  • 黑名单模式(销毁指定字段):blacklist = ["password", "token", Symbol.for("auth")];
  • 白名单模式(只保留指定字段):whitelist = ["id", "name", "email"]; // 其余全部删除

用 Reflect.ownKeys 获取全部自有键,含不可枚举与 Symbol 键

Reflect.ownKeys(obj) 返回一个数组,包含对象所有自有属性的键,顺序为:整数索引升序(对类数组对象也生效),然后按其他字符串键的创建顺序,最后是 Symbol 键。相比 Object.keys()Object.getOwnPropertyNames(),它更完整——能捕获通过 Object.defineProperty 设置的不可枚举属性以及 Symbol 属性。

举例:

const user = { name: "Alice" };
Object.defineProperty(user, "password", { value: "123", enumerable: false });
user[Symbol("token")] = "abc";
Reflect.ownKeys(user); // ["name", "password", Symbol(token)]

可见,password 虽然不可枚举,Symbol("token") 虽然是 Symbol,全都被一一找出。

遍历键并执行精准删除

获取所有键之后,逐一判断是否在敏感列表中,若在,则用 delete obj[key] 移除。注意:如果属性是不可配置的(configurable: false),delete 会静默失败(严格模式下会抛错)。此时可以退而求其次,将属性值赋为 undefinednull,实现逻辑上的销毁。

  • 黑名单方式(推荐):遍历 Reflect.ownKeys 的结果,对每个 key 判断是否在 blacklist 中,是则 delete。
  • 白名单方式:先保存 whitelist 中存在的键,再遍历所有 ownKeys,不在 whitelist 中的都 delete。
  • Symbol 匹配要确保引用一致:用 Symbol.for("key") 注册全局 Symbol,或者直接复用定义时的 Symbol 常量。

封装成可复用的安全清理函数

最后,将上述逻辑封装成一个函数,支持传入对象、敏感字段数组,并可添加配置项(如是否启用严格模式),提高复用性和健壮性。

function scrubSensitive(obj, sensitiveKeys) {
  if (typeof obj !== 'object' || obj === null) return obj;
  const keys = Reflect.ownKeys(obj);
  for (const key of keys) {
    if (sensitiveKeys.some(s => 
      (typeof s === 'symbol' && s === key) || 
      (typeof s === 'string' && s === key)
    )) {
      try {
        delete obj[key];
      } catch (e) {
        obj[key] = undefined; // fallback for non-configurable props
      }
    }
  }
  return obj;
}

// 使用示例
const data = { name: "Bob", password: "x", [Symbol("api")]: "secret" };
scrubSensitive(data, ["password", Symbol.for("api")]);

这样一来,无论对象中包含多少不可枚举、Symbol 或不可配置的属性,都能精准按需清理,同时不影响其他正常字段。重申:Reflect.ownKeys 只负责枚举,真正的销毁动作仍需 delete 或赋值为 undefined,两者配合才能实现高效精准的清理。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。