深入理解JavaScript中可枚举与不可枚举属性

作者:小括号

时间:2026-10-25

浏览:226

本文详细解析JavaScript中对象属性的可枚举性概念,探讨其由enumerable值决定的机制。通过实例演示如何判断属性是否可枚举,并深入分析枚举性对for...in循环、Object.keys()及JSON.stringify()三个关键函数的具体影响,帮助开发者准确掌握属性遍历与序列化的行为差异。

文章目录

可枚举与不可枚举属性的基本概念

在JavaScript语言中,对象属性被划分为可枚举(enumerable)与不可枚举两类,这一分类直接取决于属性描述符中的enumerable配置值。该配置值决定了属性是否能够被for...in循环结构所遍历和访问。

判断属性可枚举性的方法

一、如何判断属性是否可枚举

JavaScript中基本包装类型的原型属性默认设置为不可枚举,例如Object、Array和Number等构造函数。若尝试直接遍历这些类型的实例属性,代码执行如下:

基本包装类型原型属性示例


var num = new Number();
for(var pro in num) {
  console.log("num." + pro + " = " + num[pro]);
}

上述代码的执行结果为空。原因在于Number等内置类型中定义的属性被标记为不可枚举,因此无法通过for...in语句访问到这些内置属性。

Object对象提供了一个propertyIsEnumerable()方法,用于检测当前对象是否包含指定属性,并进一步确认该属性是否具备可枚举特性。

需要特别注意:当检测的属性存在于Object对象的原型链上时,无论该属性实际是否可枚举,propertyIsEnumerable()方法均会返回false。

枚举性对关键函数的影响

二、枚举性的实际作用

属性的可枚举状态会直接影响以下三个JavaScript内置函数的执行结果:

  • for...in循环
  • Object.keys()方法
  • JSON.stringify()序列化

首先通过以下代码创建一个名为kxy的对象实例:

创建不可枚举属性实例


function Person() {
  this.name = "KXY";
}
Person.prototype = {
  constructor: Person,
  job: "student",
};
 
var kxy = new Person();
Object.defineProperty(kxy, "sex", {
  value: "female",
  enumerable: false
});

在此过程中,使用Object.defineProperty()方法为对象定义了一个名为“sex”的属性,并将其enumerable值设置为false,即不可枚举。

接下来进行以下验证操作:

for...in循环遍历验证


for(var pro in kxy) {
  console.log("kxy." + pro + " = " + kxy[pro]);
 }

遍历执行结果如下:

可枚举与不可枚举属性的基本概念

从输出可以看出,除了“sex”属性外,其他所有属性均被成功遍历。

Object.keys()方法验证

执行console.log(Object.keys(kxy));

输出结果为:

可枚举与不可枚举属性的基本概念

结果仅包含“name”属性,这表明Object.keys()方法仅返回对象自身拥有的可枚举属性。

JSON.stringify()序列化验证

执行console.log(JSON.stringify(kxy));

输出结果为:

可枚举与不可枚举属性的基本概念

该方法同样仅读取对象自身的可枚举属性,并将其序列化为JSON格式字符串。

以上内容涵盖了JavaScript中可枚举与不可枚举属性的核心知识点,希望能对读者的学习有所帮助,也欢迎大家继续支持本站获取更多技术内容。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章