JavaScript 中遍历对象的属性

原文链接

JavaScript 中遍历对象的属性

参考

JavaScript中的属性:如何遍历属性
《JavaScript 高级程序设计》

概述

遍历 JavaScript 对象中的属性没有其他语言那么简单,因为两个因素会影响属性的遍历:属性的 [[Enumerable]] 特性为 true 才能被 for-in 访问;由于原型链,访问属性时会沿着整个原型链从下到上查找属性。所以说遍历属性时,要考虑这两个因素。

开始遍历

先定义两个类吧:Person 和 Student,后者继承前者。然后再声明并初始化一个 Student 的实例 p1。其中自身属性有 grade(可枚举) 和 tel(不可枚举),从原型链继承属性 type.
可枚举意思是属性的 [[Enumerable]] 值为 true,自身的属性意思是不是从 原型链 继承的属性

function Person(name) {    this.name = name;}Person.prototype.type = "people";function Student(name, grade) {    Person.call(this, name);    this.grade = grade;}Student.prototype = new Person();Student.prototype.constructor = Student;var p1 = new Student("Zero", "Junior");Object.defineProperty(p1, "tel", {    value: 123456,    enumerable: false});

遍历可枚举的、自身的属性

使用 Object.keys() 或是 for in + hasOwnProperty()

for (let prop of Object.keys(p1)){    console.log(prop);}
for (prop in p1) {    if (p1.hasOwnProperty(prop)) {        console.log(prop);    }}

结果是:name 和 grade 属性
注:后者对浏览器的支持更佳

遍历所有(可枚举的&不可枚举的)、自身的属性

使用 Object.getOwnPropertyNames()

for(let prop of Object.getOwnPropertyNames(p1)) {    console.log(prop);}

结果是:name 、 grade 和 tel 属性

遍历可枚举的、自身+继承的属性

使用 for-in

var getEnumPropertyNames = (obj) => {    var props = [];    for (prop in obj) {        props.push(prop);    }    return props;};for (let prop of getEnumPropertyNames(p1)) {    console.log(prop);}

结果是:name 、 grade 、 constructor 和 type 属性

遍历所有的、自身+继承的属性

var getAllPropertyNames = (obj) => {    var props = [];    do {        props = props.concat(Object.getOwnPropertyNames(obj));    } while (obj = Object.getPrototypeOf(obj));    return props;};for (let prop of getAllPropertyNames(p1)) {    console.log(prop);}

结果很多:包括自身属性 name 、 grade 等,继承属性 type 、 toString 、valueOf 等

EOF

关键字:JavaScript

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部