JavaScript 获取对象属性 API 详解:枚举性与 Symbol 处理
本文详解 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 的资料请关注本站其它相关文章!
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
