object.hasown是校验json数据字段存在性的现代首选方法,它不查原型链、不被对象自身方法覆盖、能准确区分“字段缺失”和“值为undefined”,特别适合处理后端返回的不可信数据。

Object.hasOwn 是校验 JSON 数据字段存在性的现代首选方法,它不查原型链、不被对象自身方法覆盖、能准确区分“字段缺失”和“值为 undefined”,特别适合处理后端返回的不可信数据。
校验必需字段是否真实存在于对象自身
JSON.parse() 后的对象看似干净,但若后端返回恶意构造的数据(如 {"__proto__": {"admin": true}}),直接用 data.id !== undefined 或 "id" in data 可能误判。正确做法是:
- 对每个关键字段单独调用
Object.hasOwn(data, 'id')、Object.hasOwn(data, 'name') - 组合多个校验时用逻辑与:
if (!Object.hasOwn(data, 'id') || !Object.hasOwn(data, 'role')) - 避免连写
Object.hasOwn(data, 'id', 'role')——该方法只接受两个参数,多传会被忽略
嵌套结构中安全提取自有属性
当 JSON 数据含多层嵌套(如 user.profile.settings.theme),不能假设中间层级一定存在。应逐层校验:
- 先确认
Object.hasOwn(data, 'user'),再确认Object.hasOwn(data.user, 'profile') - 封装递归校验函数,例如:
function safeGet(obj, path) { const keys = path.split('.'); let current = obj; for (const key of keys) { if (!Object.hasOwn(current, key)) return undefined; current = current[key]; } return current; } - 对数组项也适用:
users.forEach(u => Object.hasOwn(u, 'email') && console.log(u.email))
配合结构化克隆防御原型污染
仅靠 Object.hasOwn 不足以完全防住原型投毒,需结合安全解析流程:
- 始终使用原生
JSON.parse()(它不会执行代码,且默认隔离原型) - 若后续需深拷贝(如存入缓存或跨上下文传递),优先用
structuredClone(),然后立即用Object.hasOwn检查核心字段 - 不要在克隆前跳过校验——污染可能已发生在解析后的瞬间
- 对 Symbol 键同样有效:
const sym = Symbol('token'); Object.hasOwn(data, sym)
注意类型安全与兼容性边界
Object.hasOwn 要求第一个参数必须是对象,否则抛 TypeError:
- 校验前加类型守卫:
if (data != null && typeof data === 'object') { /* 再调用 hasOwn */ } - 不适用于 Map/Set:它们用各自的
.has()方法,勿混用 - 旧环境(如 Node.js Object.prototype.hasOwnProperty.call(obj, key)
- TypeScript 项目确保
lib配置包含es2022或更高版本
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











