var keys = Object.getOwnPropertyNames(Person.prototype);
console.log(keys);//["constructor", "name", "age", "job", "sayHi"]
var obj = { 0: "a", 1: "b", 2: "c"};
console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"]
前言
本篇内容将按照下图展开:
![](https://i-blog.csdnimg.cn/blog_migrate/6e360dce45581deb115361930ce7cfc5.png)
遍历Object
Object最常见的遍历方法方法就是使用for…in…,但其有一定的局限性,比如只能遍历可枚举属性。虽然Object无法直接使用for循环和forEach,但是经过Reflect.ownKeys / Object.getOwnPropertyNames / Object.getOwnPropertySymbols / Object.keys等方法转换直接得到Object中key值的集合后,是可以通过for循环和forEach来遍历的。
方法 | 获取属性种类 |
---|---|
Object.keys | 可枚举属性 |
Object.getOwnPropertySymbols | Symbol属性 |
Object.getOwnPropertyNames | 可枚举属性和不可枚举属性 |
Reflect.ownKeys | 不可枚举属性和Symbol属性 |
比如现在有个对象,其中有3个属性,分别是可枚举属性、不可枚举属性和Symbol属性:
let person = {
name : 'xiaoming'
}
person[Symbol('sex')] = 'man';
Object.defineProperty(person, 'age', {
value : 18,
writable: true,
configurable: false,
enumerable: false
})
使用for…in…遍历
for(let key in person){
console.log('key : ' + key + ' , value : ' + person[key]);
}
输出结果:
使用Object.keys + for循环遍历
let keys2 = Object.keys(person);
for(let index = 0, length = keys2.length; index < length; index++){
let key = keys2[index];
let value = person[key];
console.log('key : ' + key + ' , value : ' + value);
}
输出结果:
使用Object.getOwnPropertyNames + for循环遍历
let names = Object.getOwnPropertyNames(person);
for(let index = 0, length = names.length; index < length; index++){
let key = names[index];
let value = person[key];
console.log('key : ' + key + ' , value : ' + value);
}
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/51233671bab2eeac85a08a8882b739c7.png)
使用Object.getOwnPropertySymbols + for循环遍历
let symbols = Object.getOwnPropertySymbols(person);
for(let index = 0, length = symbols.length; index < length; index++){
let key = symbols[index];
let value = person[key];
typeof key === 'symbol' ? key = Symbol.prototype.toString.call(key) : '';
console.log('key : ' + key + ' , value : ' + value);
}
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/e26ad8f948b68c3451e4a9e2ba4ea413.png)
使用Reflect.ownKeys + for循环遍历
let keys = Reflect.ownKeys(person);
for(let index = 0, length = keys.length; index < length; index++){
let key = keys[index];
let value = person[key];
typeof key === 'symbol' ? key = Symbol.prototype.toString.call(key) : '';
console.log('key : ' + key + ' , value : ' + value);
}
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/83f5bad9f881e8482a7221612245c78f.png)
遍历Array
遍历Array可以使用for循环,也可以使用for…in…和for…of…,并且Array的原型中还有forEach函数和map函数可用来遍历Array对象。
测试数据:
let arr = ['item_1', 'item_2', 'item_3', 'item_4', 'item_5'];
使用for…in…遍历
for(let index in arr){
console.log('index : ' + arr[index]);
}
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/24ed07023a991db52ca3b4b2970d884b.png)
使用for循环遍历
f
for(let index = 0, length = arr.length; index < length; index += 1){
console.log('index : ' + arr[index]);
}
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/32320905cf069c474ccf5349c60e225e.png)
使用Array.prototype.forEach遍历
Array.prototype.forEach.call(arr, (value) => {
console.log('value : ' + value);
})
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/29cfa6090255f79ea4500287b0469420.png)
使用Array.prototype.map遍历
Array.prototype.map.call(arr, (value) => {
console.log('value : ' + value);
})
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/093f2ec0db6f557e5d178758c499f07b.png)
for…of…遍历
map方法会根据原数组中的每个元素调用函数后返回的数据创建一个新数组。
使用for…of…遍历
Array.prototype.map.call(arr, (value) => {
console.log('value : ' + value);
})
输出结果:
![](https://i-blog.csdnimg.cn/blog_migrate/111c8b5630f3eef1b33dbfbb6069f7e5.png)
遍历Map
遍历Map一般是两种,一是直接使用for…of…或者Map.prototype.forEach,二是通过Map.prototype.entries / Map.prototype.keys / Symbol.iterator获取Map对象的迭代器,再通过for…of…来遍历迭代器。
测试数据:
l
et map = new Map();
map.set('key_1', 'value_1');
map.set('key_2', 'value_2');
map.set('key_3', 'value_3');
map.set('key_4', 'value_4');
map.set('key_5', 'value_5');
Object.keys()
方法取得对象上所有可枚举的实例属性
接收一个对象作为参数,返回一个包含所有可枚举属性的字符串数组。
function Person() {
}
Person.prototype.name = "Tom Holland";
Person.prototype.age = 23;
Person.prototype.job = "Spider man";
Person.prototype.sayHi = function() {
alert("love you three thousand times");
};
var keys = Object.keys(Person.prototype);
console.log(keys);// ["name", "age", "job", "sayHi"]
var p1 = new Person();
p1.name = "Robert Downey Jr.";
p1.age = 54;
var p1keys = Object.keys(p1);
console.los(p1keys);//["name", "age"]
-
for-in
循环返回所有能够通过对象访问的、可枚举的( enumerated )属性
包括存在于实例中的属性,也包括存在于原型中的属性 -
Object.getOwnPropertyNames()
方法取得所有实例属性,无论是否可枚举(但不包括Symbol值作为名称的属性)