JavaScript 对象属性遍历与描述详解

JavaScript 对象属性遍历与描述详解

在 JavaScript 中,对象是一种非常重要的数据类型。理解如何遍历对象的属性以及对象属性的描述,对于高效使用 JavaScript 至关重要。本文将详细介绍对象属性的遍历方法和属性描述对象的相关内容。

一、对象属性的遍历方法

1. for...in 循环

for...in 循环用于遍历对象的可枚举 属性,包括对象自身 的属性和继承自原型链上的属性。

收起

javascript

vbnet 复制代码
const obj = {
    id: 1,
    name: 'zhangsan',
    age: 18
};

for (let key in obj) {
    console.log(key + '---' + obj[key]);
}

如果该属性是可枚举 性的,那么这个属性就能被 for...in 查找遍历到。需要注意的是,它会包含原型上的属性。

2. Object.keys() 和 Object.values()

  • Object.keys(obj):返回一个表示给定对象的所有可枚举 自身属性的键名组成的字符串数组。

  • Object.values(obj):返回一个表示给定对象的所有可枚举 自身属性的值组成的数组。

收起

javascript

javascript 复制代码
const obj = {
    id: 1,
    name: 'zhangsan',
    age: 18
};

console.log(Object.keys(obj));
console.log(Object.values(obj));

参数 obj 是要返回其枚举自身属性的对象。

3. Object.getOwnPropertyNames(obj)

该方法返回一个数组,包含对象自身 的所有属性(包含不可枚举 属性),但不会获取继承 自原型链上的属性。通过遍历该数组可以获取属性的 key 和 value。

收起

javascript

javascript 复制代码
function Person() {
    this.name = '张三';
}
Person.prototype = {
    constructor: Person,
    job: "student"
};

var student1 = new Person();

Object.defineProperty(student1, 'age', {
    value: "33",
    enumerable: false  // 设置为**不可枚举**属性
});

Object.getOwnPropertyNames(student1).forEach(function (key) {
    console.log(key + '---' + student1[key]);  // 结果:name---张三   age---33
});

4. Object.entries()

Object.entries() 方法返回一个给定对象自身 可枚举 属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举继承自原型链中的属性)。

收起

javascript

javascript 复制代码
let per = {
    name: 'zdx',
    age: 18
};

for (let [key, value] of Object.entries(per)) {
    console.log(key, value);
}
// 输出:
// name zdx
// age 18

5. Reflect.ownKeys()

Reflect.ownKeys(target) 方法返回所有的属性 key,包括不可枚举 类型,但不包括继承的属性。

收起

javascript

javascript 复制代码
let obj = {
    name: 'zhangsan',
    age: '18'
};
console.log(Reflect.ownKeys(obj));

参数 target 是获取目标对象的属性,如果 target 不是对象则会报错,返回值是由 target 自身属性组成的数组。

二、对象属性的描述

对象的每一个属性都有一个描述对象,用来描述和控制该属性的行为。可以使用 Object.getOwnPropertyDescriptor 方法来获取该描述对象,使用 Object.defineProperty 方法来设置。

收起

javascript

javascript 复制代码
let obj = { start: '123' };
console.log(Object.getOwnPropertyDescriptor(obj, 'start'));
// 输出内容:
// {
//     configurable: true,
//     enumerable: true,
//     value: "123",
//     writable: true
// }

Object.defineProperty(obj, "sex", {
    value: "female",
    enumerable: false
});

描述对象的四个属性

  1. configurable :表示能否通过 delete 删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性。如果直接使用字面量定义对象,默认值为 true。
  2. enumerable :表示该属性是否可枚举 ,即是否能通过 for-in 循环或 Object.keys() 返回属性。如果直接使用字面量定义对象,默认值为 true。
  3. writable :表示能否修改属性的值。如果直接使用字面量定义对象,默认值为 true。
  4. value :该属性对应的值,默认为 undefined。

与 enumerable 相关的操作

目前,有四个操作不包含 enumerable 为 false 的属性:

  • for...in 循环:只遍历对象自身 的和继承 的可枚举的属性。
  • Object.keys():返回对象自身 的所有可枚举的属性的键名。
  • JSON.stringify():只串行化对象自身 的可枚举的属性。
  • Object.assign():拷贝对象自身 的可枚举的属性。

三、区分自身属性和原型属性

对象的属性有自身 属性和继承 自原型的属性之分,自身 属性是对象自己的属性,继承 自原型的属性是存在于原型链上的属性。可以使用 Object.prototype.hasOwnProperty() 判断是自身 属性还是继承 自原型的属性,而 in 操作符只可以判断对象是否有某个属性,不能判断是自身 的还是继承自原型的。

综上所述,掌握这些对象属性的遍历方法和属性描述的知识,能够帮助我们更好地操作和管理 JavaScript 对象。

相关推荐
lpfasd1232 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Data analyse4565 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai5 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记6 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁6 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu6 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!6 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格7 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人7 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid7 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet