in 运算符检查属性是否存在于对象自身或原型链中,hasownproperty 和 object.hasown() 仅检查对象自身属性;前者适用于判断可访问性,后两者用于确认自有属性。

在 JavaScript 中,in 运算符和 hasOwnProperty 都能判断对象是否拥有某个属性,但它们检查的范围不同:前者查**整个原型链**,后者只查**对象自身**。
用 in 判断属性是否存在于对象或其原型链中
in 返回布尔值,只要属性名(字符串)在对象自身或任意上层原型中存在,就返回 true。它不关心属性是否可枚举、是否为 undefined,甚至不关心属性值是否存在(比如 obj.prop = undefined 之后,'prop' in obj 仍为 true)。
- 语法简单:
'key' in obj - 支持变量:可用
const k = 'name'; k in obj - 对
null或undefined会报错,使用前建议先做类型检查 - 示例:
const parent = { a: 1 };const child = Object.create(parent); child.b = 2;'a' in child // true(继承自 parent)'b' in child // true(自身拥有)'toString' in child // true(来自 Object.prototype)
用 hasOwnProperty 判断属性是否仅在对象自身上
obj.hasOwnProperty('key') 只检查对象**自有属性**(own property),不沿原型链查找。这是区分“继承来的”和“自己定义的”最常用方式。
- 注意:它是
Object.prototype上的方法,若对象自身重写了该方法或原型链被切断(如Object.create(null)),会失效;稳妥写法是Object.prototype.hasOwnProperty.call(obj, 'key') - 不能接受 Symbol 类型键(ES2015+),需改用
Object.hasOwn(obj, key)(推荐新项目优先使用) - 示例:
child.hasOwnProperty('a') // falsechild.hasOwnProperty('b') // truechild.hasOwnProperty('toString') // false
现代替代方案:Object.hasOwn()
ES2022 引入的 Object.hasOwn(obj, key) 是 hasOwnProperty 的安全、直接替代品。它不依赖对象原型,支持 Symbol 键,语义更清晰。
- 兼容性良好(Chrome 93+/Firefox 92+/Node.js 16.9+,旧环境可加 polyfill)
- 写法更直观:
Object.hasOwn(child, 'b')比child.hasOwnProperty('b')更可靠 - 与
in的核心区别不变:它只看自身,in看整条链
怎么选?看你要回答什么问题
- “这个键能不能通过
obj.key访问到?” → 用in - “这个属性是不是我(或代码明确)加在这个对象上的?” → 用
Object.hasOwn() - 需要兼容极老环境且确定不会覆盖
hasOwnProperty→ 用Object.prototype.hasOwnProperty.call() - 避免误判继承属性(比如遍历对象时跳过原型方法)→ 优先
Object.hasOwn()
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











