版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38102188/article/details/83743791
- 仅遍历对象的可枚举属性
- for in: 遍历的是对象本身及其原型链上的可枚举属性
ES5写法:
对于Object对象,即Object构造器构造出来的对象来说:
var obj = {name: 'zyp', age: 18}
Object.defineProperty(obj, 'like', {value: 'reading', enumerable: false})
let objArr1 = [], objArr2 = []
for(let i in obj) {
objArr1.push(i)
}
console.log('objArr1',objArr1)
Object.prototype.proper1 = function() { console.log(1111)}
Object.prototype.proper2 = 2
for(let i in obj) {
objArr2.push(i)
}
console.log('objArr2',objArr2)
输出结果为
objArr1 [“name”, “age”]
objArr2 [“name”, “age”, “proper1”, “proper2”]
对于自己自己定义的构造器构造出来的对象而言:
function Foo(name, age) {
this.name = name
this.age = age
}
var foo = new Foo('zyp', 18)
Object.defineProperty(foo, 'like', {
value: 'sleep',
enumerable: false
})
let fooArr1 = [], fooArr2 = [];
for(let i in foo) {
fooArr1.push(i)
}
console.log('fooArr1',fooArr1 )
Foo.prototype.proper1 = function() {
console.log(1111)
}
Foo.prototype.proper2 = 2
for(let i in foo) {
fooArr2.push(i)
}
console.log('fooArr2', fooArr2)
输出结果为
fooArr1 [“name”, “age”]
fooArr2 [“name”, “age”, “proper1”, “proper2”]
ES6写法:
//定义父类A
class A {
constructor(name, age) {
this.name = name;
this.age = age;
}
show() {
console.log(22222)
}
}
let newA = new A('zyp', 18)
Object.defineProperty(newA, 'haha', {value: 'haha', enumerable: false})
let newAarr = [];
for(let i in newA) {
newAarr.push(i)
}
console.log('newAarr',newAarr)
输出结果是newAarr [“name”, “age”] ,因为’haha’是不可枚举属性,show函数默认定义在原型链上,但是这种用class定义的行为属性是不可枚举的(我试了用构造函数方法在prototype上定义行为属性是可以枚举的,这里搞不懂~~)
//定义子类
class AA extends A {
constructor(like) {
super('zyp1', 188);
this.like = like;
}
showAA() {
}
}
let newAA = new AA('reading')
Object.defineProperty(newAA, 'haha2', {value: 'haha2', enumerable: false})
let newAAarr = []
for(let i in newAA) {
newAAarr.push(i)
}
console.log('newAAarr', newAAarr)
输出的结果为 newAAarr [“name”, “age”, “like”]
因此,for in 可以迭代出对象及其圆形两上的可枚举属性,而hasOwnProperty可以判断属性是否在当前对象上,因此可用来过滤for in 从原型链上循环出来的属性,得到对象本身的可枚举属性。
- hasOwnProperty可以用来遍历对象本身的可枚举和不可枚举属性
以ES5写法中的obj为例:
var objArr3 = []
for(let i in obj) {
if(obj.hasOwnProperty(i)) {
objArr3.push(i)
}
}
console.log('objArr3', objArr3) //objArr3 ["name", "age"]
- 用Object.keys()来获取对象本身的可枚举属性名
var objArr4 = Object.keys(obj)
console.log('objArr3', objArr3) //objArr3 ["name", "age"]
总结:可以用for in + hasOwnproperty 或者Object.keys()来获取对象的可枚举属性。
- 获取对象本身的属性(可枚举和不可枚举,不包括Symbol类型的属性)
以数组为例
var arr = ['name', 'age']
console.log(object.getOwnPropertyNames(arr)) //输出["0", "1", "length"]
总结:可以用Object.getOwnPropertyNames()来获取对象本身的可枚举和不可枚举属性(不包括Symbol)。