object.hasown 能准确检测对象自身定义的 symbol 属性,无论是否可枚举或是否在原型上,仅当 symbol 是对象自身的属性时返回 true;它不依赖枚举性、不查原型链、不接受字符串伪装,且比 object.keys() 等方法更专注可靠。

Object.hasOwn 能准确检测对象自身定义的 Symbol 属性,不管它是否可枚举、是否被设为不可枚举,只要该 Symbol 是对象“自己身上的”,就返回 true;如果只在原型上,或根本没定义,就返回 false。它不依赖枚举性,也不走原型链,是目前最直接、最安全的单键存在性检查方式。
支持原始 Symbol 值,不接受字符串伪装
必须传入真实的 Symbol 实例,不能传字符串形式的描述。
- ✅ 正确:
const sym = Symbol('id'); Object.hasOwn(obj, sym) - ❌ 错误:
Object.hasOwn(obj, 'Symbol(id)')或Object.hasOwn(obj, Symbol('id'))(每次调用生成新 Symbol,引用不同)
对不可枚举的 Symbol 属性同样有效
用 Object.defineProperty 设置的不可枚举 Symbol 属性,hasOwn 依然能识别。
- 例如:
Object.defineProperty(obj, sym, { value: 42, enumerable: false }) -
Object.hasOwn(obj, sym)返回 true,而Object.keys(obj)和for...in都看不到它
完全不查原型链,哪怕原型上有同名 Symbol
即使父级原型定义了某个 Symbol 属性,只要没显式赋值到当前对象自身,hasOwn 就判定为不存在。
- 例如:
const proto = { [sym]: 'from proto' }; const obj = Object.create(proto); -
Object.hasOwn(obj, sym)→ false;Object.hasOwn(proto, sym)→ true - 这和
in操作符行为截然不同——sym in obj会返回 true
比其他方法更专注、更可靠
它不靠遍历、不生成数组、不触发 getter,只做一件事:确认这个键是不是对象自己的。
-
Object.keys():漏掉所有 Symbol,无论可不可枚举 -
Object.getOwnPropertyNames():能捕获不可枚举字符串键,但对 Symbol 完全无视 -
Object.getOwnPropertySymbols():只管 Symbol,不管字符串键,且需额外遍历判断 -
Object.hasOwn():单次调用、语义明确、类型严格、结果可预期
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











