当前位置: 首页 > news >正文

hasOwnProperty是什么

什么是 hasOwnProperty

hasOwnProperty() 是 JavaScript 中所有对象(通过 Object.prototype)都拥有的一个方法。它用于检查一个对象自身是否具有指定的属性(而不是从原型链继承而来的)。

语法:

object.hasOwnProperty(propertyName)
  • propertyName:一个字符串,表示要检查的属性名称(也可以是 Symbol)。
  • 返回值:一个布尔值(Boolean)。
    • true:如果对象自身有该属性。
    • false:如果对象自身没有该属性(或者该属性存在于原型链上)。

为什么需要它? (与 in 操作符的区别)

理解 hasOwnProperty 的关键是明白它与 for...in 循环或 in 操作符的区别。

  • in 操作符:检查一个属性是否在对象或其原型链上。
  • hasOwnProperty检查属性是否在对象自身上。

看一个例子就明白了:

// 创建一个对象
const person = {name: 'Alice',age: 30
};// 1. 检查自身属性 - 返回 true
console.log(person.hasOwnProperty('name')); // true
console.log(person.hasOwnProperty('age'));  // true// 2. 检查不存在的属性 - 返回 false
console.log(person.hasOwnProperty('toString')); // false
// 为什么是 false?因为 toString 是从 Object.prototype 继承来的,不是 person 对象自身的属性。// 3. 使用 'in' 操作符对比
console.log('toString' in person); // true
// 'in' 操作符会沿着原型链查找,找到了 toString 方法,所以返回 true。// 4. 检查原型链上的属性
const student = {major: 'Computer Science'
};// 让 student 继承 person 的属性
Object.setPrototypeOf(student, person);console.log(student.hasOwnProperty('major')); // true (自身属性)
console.log(student.hasOwnProperty('name'));  // false (继承自 person)
console.log('name' in student);               // true (in 操作符找到了它)

主要用途

  1. 在遍历对象属性时过滤掉继承属性
    这是它最常见的用途,尤其是在使用 for...in 循环时。for...in 会遍历对象自身的以及原型链上所有可枚举的属性。使用 hasOwnProperty 可以确保只处理对象自身的属性。

    const obj = { a: 1, b: 2 };// 假设 obj 的原型上有一个方法
    Object.prototype.c = function() {};for (let key in obj) {console.log(key); // 会输出 'a', 'b', 'c'
    }for (let key in obj) {if (obj.hasOwnProperty(key)) { // 使用 hasOwnProperty 过滤console.log(key); // 只输出 'a', 'b'}
    }
    
  2. 安全地检查属性是否存在
    当你需要百分百确定一个属性是对象自己定义的,而不是意外从其他地方继承来的时,就应该使用 hasOwnProperty


注意事项和现代用法

  1. 边缘情况:如果一个对象巧合地有一个自己的属性就叫 hasOwnProperty,或者通过 Object.create(null) 创建的对象没有原型,因此也没有 hasOwnProperty 方法,直接调用 obj.hasOwnProperty(...) 可能会失败。

    更安全的现代方法
    推荐使用 Object.hasOwn()(ES2022 引入),它解决了上述问题,语法更简洁。

    const obj = Object.create(null); // 一个没有原型的对象
    obj.name = 'Test';// 传统方法会报错
    // obj.hasOwnProperty('name'); // TypeError: obj.hasOwnProperty is not a function// 现代安全的方法
    console.log(Object.hasOwn(obj, 'name')); // true
    

    或者,也可以调用 Object.prototype 上的方法:

    console.log(Object.prototype.hasOwnProperty.call(obj, 'name')); // true
    

总结

特性hasOwnPropertyin 操作符
检查范围仅对象自身对象自身 + 原型链
继承属性falsetrue
自身属性truetrue
不存在属性falsefalse

简单来说:当你只关心对象“自己拥有”的属性时,就使用 hasOwnProperty(或其现代替代方案 Object.hasOwn)。

http://www.dtcms.com/a/360947.html

相关文章:

  • Linux部署OSM本地服务测试环境
  • Linux UDisks守护进程曝本地提权漏洞CVE-2025-8067,PoC已发布
  • [Android] 京墨 v1.15.2 —— 古诗词文、汉语字典、黄历等查询阅读学习宝典(可离线)
  • 别再说AppInventor2只能开发安卓了!苹果iOS现已支持!
  • AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划·视觉定位·力控策略
  • HarmonyOS 应用开发深度实践:深入 Stage 模型与 ArkTS 声明式 UI
  • STM32-FreeRTOS操作系统-任务创建
  • 开源AI大模型AI智能名片S2B2C商城小程序赋能下的“信息找人“:人工智能驱动的线下零售精准化革命
  • 高效大规模创新3D重建模型iLRM
  • 【STM32】贪吃蛇 [阶段 3] 增强模块结构(架构优化)
  • HarmonyOS应用开发深度解析:基于Stage模型与ArkTS的现代实践
  • ServBay 是一款集成式、图形化的本地 Web 开发环境工具,专为 macOS 和 Windows 系统设计
  • LeetCode 142. 环形链表 II - 最优雅解法详解
  • Linux自动化构建工具-make/Makefile
  • 【并发场景问题】超卖、一人一单业务问题的解决方案
  • AI 重构医疗诊断:影像识别准确率突破 98%,基层医院如何借技术缩小诊疗差距?
  • Git指令 | 个人学习笔记
  • Interceptor拦截器入门知识及其工作原理
  • Python OpenCV图像处理与深度学习:Python OpenCV图像滤波入门
  • gradle安装、配置环境变量、配置阿里源及idea 中配置gradle
  • RabbitMinQ(模拟实现消息队列项目)02
  • Axure科技感可视化原型案例:赋能设计与研发的宝藏资源
  • 二、感知机
  • 你的Redis是不是在家能用,到了学校就连不上?
  • CPTS-Vintage 票据,基于资源的约束委派 (RBCD),DPAPI密钥
  • 搭建APP应用程序如何选择服务器
  • ‌NAT穿透技术原理:P2P通信中的打洞机制解析‌
  • 【机器学习入门】4.4 聚类的应用——从西瓜分类到防控,看无监督学习如何落地
  • Windows11安装WSL教程
  • HBase实战(一)