通过反射机制获取对象所有自身属性键(包括不可枚举和符号键),利用数组定义的黑名单或白名单,逐个遍历这些键并执行删除操作或将其赋值为未定义,从而实现敏感属性的精准销毁,并支持对不可配置属性进行降级处理。
需要先明确: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(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 会静默失败(严格模式下会抛错)。此时可以退而求其次,将属性值赋为 undefined 或 null,实现逻辑上的销毁。
Reflect.ownKeys 的结果,对每个 key 判断是否在 blacklist 中,是则 delete。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,两者配合才能实现高效精准的清理。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述