JavaScript 获取对象属性 API 详解:枚举性与 Symbol 处理

作者:函数茶馆时间:2026-10-25 22:06:07浏览:636

本文详解 JavaScript 中获取对象属性的多种 API。通过 Object.getOwnPropertyDescriptor 理解属性描述符与可枚举性(enumerable)概念,梳理 for...in、Object.keys、Object.assign 等忽略不可枚举属性的操作。重点对比 Object.keys、Object.getOwnPropertyNames、Object.getOwnPropertySymbols 及 Reflect.ownKeys 的遍历范围与区别,涵盖自有属性、原型链及 Symbol 类型的完整获取方式。

可枚举性介绍

在 JavaScript 中,对象的每个属性都关联一个描述对象(Descriptor),用于定义和控制该属性的具体行为特征。

使用 Object.getOwnPropertyDescriptor 方法可以获取指定属性对应的描述对象,从而查看其配置详情。

代码示例:

let obj = {
    name: 'Tom',
    age: 20
}
console.log(Object.getOwnPropertyDescriptor(obj,'name'))
// {
//    configurable: true
//    enumerable: true
//    value: "Tom"
//    writable: true
// }

描述对象中包含一个名为 enumerable 的属性,即“可枚举性”。若该值为 false,则表明某些特定操作会忽略当前属性,不对其进行遍历或处理。

目前 JavaScript 中有四个主要操作会忽略 enumerable 为 false 的属性。

for...in 循环:仅遍历对象自身以及继承自原型链的可枚举属性。

Object.keys():返回一个数组,包含对象自身所有可枚举属性的键名。

JSON.stringify():仅序列化对象自身的可枚举属性,不可枚举属性将被忽略。

Object.assign():在拷贝属性时,会忽略 enumerable 为 false 的属性,仅复制对象自身的可枚举属性。

获取对象属性 API

1. for...in

for...in 语句主要用于遍历对象的可枚举属性,包括对象自身的属性以及继承自原型链的属性。代码示例:

var obj = {"name":"tom","sex":"male"};
Object.defineProperty(obj, "age", {value:"18", enumerable:false});
//增加不可枚举的属性age
Object.prototype.protoPer1 = function(){console.log("name is tom");};
//通过原型链增加属性,为一个函数
Object.prototype.protoPer2 = 2;
//通过原型链增加属性,为一个整型值2
for(var a in obj){
    console.log(a);
}
// name
//sex
//protoPer1
//protoPer2

2. Object.keys

此方法返回一个数组,其元素均为对象自身拥有的可枚举属性名。

Object.keys 主要用于遍历对象自有的可枚举属性,不包括继承自原型的属性,也不包括不可枚举的属性。代码示例:

var obj = {"name":"tom","sex":"male"};
Object.defineProperty(obj, "age", {value:"18", enumerable:false});
//增加不可枚举的属性age
Object.prototype.protoPer1 = function(){console.log("name is tom");};
//通过原型链增加属性,为一个函数
Object.prototype.protoPer2 = 2;
//通过原型链增加属性,为一个整型值2
console.log(Object.keys(obj));
//["name", "sex"]

3. Object.getOwnPropertyNames

该方法主要用于返回对象的所有自有属性名,既包括可枚举属性,也包括不可枚举属性,但不包括继承自原型链的属性。代码示例:

var obj = {"name":"tom","sex":"male"};
Object.defineProperty(obj, "age", {value:"18", enumerable:false});
//增加不可枚举的属性age
Object.prototype.protoPer1 = function(){console.log("name is tom");};
//通过原型链增加属性,为一个函数
Object.prototype.protoPer2 = 2;
//通过原型链增加属性,为一个整型值2
console.log(Object.getOwnPropertyNames(obj));
//["name", "sex","age"]

4. Object.getOwnPropertySymbols() 遍历不可枚举属性

Symbol 类型的属性默认是不可枚举的。

Object.getOwnPropertySymbols() 可以获取指定对象的所有 Symbol 类型属性名。代码实例:

var obj = {};
var a = Symbol('a');
var b = Symbol('b');
obj[a] = 'ikun';
obj[b] = 'cai';
var objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols)
//[ Symbol(a), Symbol(b) ]

Reflect.ownKeys

Reflect.ownKeys 方法可以返回对象自身所有类型的键名(包括字符串和 Symbol),不包括继承自原型链的属性。代码示例:

let obj = {
  [Symbol('my_key')]:1,
  enum:2,
  nonEnum:3
};
let objectKeys =Reflect.ownKeys(obj)
console.log(objectKeys)
//[ 'enum', 'nonEnum', Symbol(my_key) ]

以上就是 JS 获取对象属性 API 汇总枚举 symbol 的详细内容,更多关于 JS 获取对象属性 API 的资料请关注本站其它相关文章!

作者最新文章