对象属性的遍历

for in

for…in..遍历的是对象中的所有可枚举属性(包含自身属性和继承属性)

可以用hasOwnProperty来判断是否是对象自己含有的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let obj = {
name: '张三',
age: 18,
sex: 'male'
}
let newobj = Object.create(obj); //新建一个对象继承obj
newobj.hobby = 'learning';
newobj.school = '家里蹲';
for (let i in newobj) {
console.log(i); //直接遍历
}
for (let i in newobj) {
if (newobj.hasOwnProperty(i)) { //只遍历本身的属性
console.log(i);
}
}

输出结果

那么,获取原型链上的属性就可以自然封装出来了

1
2
3
4
5
function hasPrototypeProperty(obj,name){
return !obj.hasOwnProperty(name)&&(name in obj)
//保证不是本身属性那么就是继承属性了
}
console.log(hasPrototypeProperty(newobj,'name'))//true

Object.keys()

返回一个包含所有的可枚举的自有属性的名称组成的数组

1
2
3
4
5
console.log(Object.keys(newobj));//['hobby', 'school']
Object.defineProperty(newobj,'hobby',{
enumerable:false //将hobby设为不可枚举
})
console.log(Object.keys(newobj)) //['school']

Object.getOwnPropertyNames()

返回自有属性的名称(不管是否可枚举)

1
2
console.log(Object.getOwnPropertyNames(newobj))//['hobby','school']
//虽然前面将hobby设为了不可枚举,但是依然能显示相应的名称

对象属性的遍历
https://blog-theta-ten.vercel.app/2021/10/11/对象属性的遍历/
作者
Chen
发布于
2021年10月11日
许可协议