一个对象的属性本身,也有不同类型:是否是来自继承的属性,是否是可枚举的属性。JS也提供了多种不同的接口函数来支持开发者得到某些特定类型的属性。下面就来看一下都有哪些接口函数以及他们之间的区别:
integer indices in ascending numeric, then strings in property creation order, then symbols in property creation order
一: for...in
for...in 是返回对象的包含自身的 && 继承的所有可迭代属性(不包含Symbol类型)。
二:Object.keys(obj)
1: 返回的是一个数组
2: 数组里面的元素是obj的属性的字符串格式
3: 返回对象的自身的,不包含继承的所有可迭代属性(Symbol除外)
let DOG = function () {};
DOG.prototype.color = 'black';
dog = new DOG();
Object.defineProperty(dog, 'age', {
value: function () {
return 2;
},
enumerable: false
});
Object.defineProperty(dog, 'name', {
value: function () {
return 'wangwang';
},
enumerable: true
});
let keys = Object.keys(dog);
console.log(keys); //["name"]
上面console的结果,不会得到color
属性,因为它是继承的;不会得到age
属性,因为它不可迭代。
三:Object.getOwnPropertyNames(obj)
1: 返回的是一个数组
2: 数组里面的元素是obj的属性的字符串格式
3: 返回对象的自身,不包含继承的不可迭代,可迭代(Symbol除外)的所有属性
四:Object.getOwnPropertySymbols(obj)
1: 返回一个Array
2: Array的元素是对象上的Symbol属性
let dog = {};
dog['he'] = 'he';
let ageSymbol = Symbol('age');
let nameSymbol = Symbol('name');
dog[ageSymbol] = 'ageSymbol';
dog[nameSymbol] = 'nameSymbol';
let keys = Object.getOwnPropertySymbols(dog);
console.log(keys); // [Symbol(age), Symbol(name)]
五:Reflect.ownKeys(obj)
1: 返回一个Array
2: Array的元素是自身的所有属性,包括可迭代,不可迭代,Symbol
let DOG = function () {};
DOG.prototype.color = 'black';
dog = new DOG();
Object.defineProperty(dog, 'name', {
enumerable: false
});
dog['he'] = 'he';
let ageSymbol = Symbol('age');
let nameSymbol = Symbol('name');
dog[ageSymbol] = 'ageSymbol';
dog[nameSymbol] = 'nameSymbol';
let keys = Reflect.ownKeys(dog);
console.log(keys); //["name", "he", Symbol(age), Symbol(name)]
总结就是:
1: 只有for...in会得到继承的属性,其他API都是自身的属性
2: Symbol类型的属性很特别,有专门的API获取
3: Reflect.ownKeys(obj)得到的属性最多,得到对象自身的所有类型的属性
4: Object.keys(obj)返回的属性最少,只得到自身的可迭代属性,Symbol除外
5: Object.getOwnPropertyNames(obj)返回的属性最普遍,最常用;就是自身的所有类型属性(Symbol除外)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。