检测自有属性用hasOwnProperty()最常用高效,检测自有+继承属性用in操作符最自然;避免Object.keys().includes()因性能差且语义冗余;安全场景用Object.prototype.hasOwnProperty.call()。
在 JavaScript 中检测对象属性是否存在,常用方法有
操作符、
、
和
(或
)。它们语义不同、适用场景不同,性能也有明显差异。直接比“谁最快”意义不大,关键看你要检测的是“自有属性”还是“原型链上也接受的属性”,以及是否需要兼容老旧环境。
检测自有属性:hasOwnProperty() 最常用且高效
是判断属性是否为对象**自身拥有**(非继承)的标准方式。它不遍历原型链,内部实现高度优化,在现代引擎中几乎无额外开销。
✅ 语义清晰:只关心对象自身属性
✅ 性能优秀:V8、SpiderMonkey 等引擎对它做了内联和快速路径优化
⚠️ 注意:若对象自身重写了
方法(极少见),会出错;此时应使用
检测自有+继承属性:in 操作符最自然
会检查属性是否存在于对象本身或其整个原型链上。它是语法级操作符,无需函数调用开销,引擎同样做了深度优化。
✅ 语义明确:适合“这个 key 能否被 obj 访问到”这类场景(如配置合并、兜底逻辑)
✅ 性能接近原生:比任何基于数组的方法快一个数量级以上
❌ 不区分属性来源:无法判断是自有还是继承,也不过滤不可枚举属性
避免使用 Object.keys().includes() —— 性能差且语义冗余
先生成所有可枚举自有属性的数组,再遍历查找。即使属性存在,也要构造数组、遍历、比较字符串。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
Java免费学习笔记(深入)
”;
❌ 时间复杂度 O(n),n 是可枚举属性数;而
和
是 O(1) 平均查找
❌ 内存开销大:每次调用都创建新数组,触发 GC 压力
❌ 语义偏差:漏掉不可枚举属性(如
用的
),也不包含原型链上的属性
特殊场景:需安全调用 hasOwnProperty 时用 call 方式
当不能确定对象是否“干净”(比如来自用户输入、第三方库或
),推荐:
Object.prototype.hasOwnProperty.call(obj, prop)
✅ 完全规避对象自身覆盖
的风险
✅ 在
对象上也能正常工作(普通
会报错)
✅ 性能略低于直接调用,但仍是 O(1) 且远优于数组方案
inhasOwnProperty()Object.prototype.hasOwnProperty.call()Object.keys().includes()Object.getOwnPropertyNames()obj.hasOwnProperty(prop)hasOwnPropertyObject.prototype.hasOwnProperty.call(obj, prop)prop in objObject.keys(obj).includes(prop)inhasOwnPropertyJSON.stringifytoJSONObject.create(null)hasOwnPropertyObject.create(null)obj.hasOwnProperty