JavaScript遍历对象总结

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"]

前言

本篇内容将按照下图展开:



遍历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);
}

输出结果:

使用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);
}

输出结果:


使用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);
}

   

输出结果:

遍历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]);
}

输出结果:



使用for循环遍历

f

for(let index = 0, length = arr.length; index < length; index += 1){
    console.log('index : ' + arr[index]);
}

输出结果:

使用Array.prototype.forEach遍历

Array.prototype.forEach.call(arr, (value) => {
    console.log('value : ' + value);
})

输出结果:

使用Array.prototype.map遍历

Array.prototype.map.call(arr, (value) => {
    console.log('value : ' + value);
})

输出结果:

for…of…遍历

map方法会根据原数组中的每个元素调用函数后返回的数据创建一个新数组。
使用for…of…遍历

Array.prototype.map.call(arr, (value) => {
    console.log('value : ' + value);
})

输出结果:

遍历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"]
  1. for-in 循环返回所有能够通过对象访问的、可枚举的( enumerated )属性
    包括存在于实例中的属性,也包括存在于原型中的属性

  2. Object.getOwnPropertyNames()方法取得所有实例属性,无论是否可枚举(但不包括Symbol值作为名称的属性)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值