0%

js中的遍历

for…in

用来遍历对象的可枚举属性列表,包括自有属性,原型链上的键,某些情况下会以任意顺序遍历键名

forEach(…)

用来遍历数组中的所有值并忽略回调函数的返回值,break命令或return 命令不能奏效

for…of

直接遍历值,会首先向被访问对象请求一个迭代器对象,然后通过调用迭代器对象的next()方法来遍历所有返回值,

和for…in一样简洁的语法,可以与break,continue和return配合使用,提供了遍历所有数据结构的统一操作接口

Object.keys()

此方法返回一个数组,元素均为对象自有的可枚举属性,不能遍历到原型链上的属性和不可枚举属性

Object.values()

与Object.keys()遍历对象的特性相同,但是其返回的结构以遍历的属性值构成得到数组

Object.entries()

返回值时Object.values()和Object.keys()的结合,会返回一个嵌套数组,数组内包括了属性名和属性值

1
2
3
4
5
let obj = {
name:"cornd",
age:10
}
Object.entries(obj) // [['name', 'cornd'],['age', 10]]

Object.getOwnPropertyNames()

返回结果和Object.keys()相同,但是它的特性与其相反,可以遍历会返回对象的所有属性,包括不可枚举属性,不包括继承自原型的属性

Reflect.ownKeys()

Reflect.ownKeys()方法返回一个由目标对象自身的属性键组成的数组。它的返回值等同于 Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))。不包含继承的属性

image-20221129001939315

image-20221129002032050

自定义对象迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var myObject={
a:2,
b:3
};
Object.defineProperty(myObject,Symbol.iterator,{
enumerable:false,
writable:false,
configurable:true,
value:function(){
var o=this;
var idx=0;
var ks=Object.keys(o);//获取Object对象所有键值
return{
next:function(){//next是一个函数
return{
value:o[ks[idx++]],
done:(idx>ks.length)
}
}
}
}
})
var it=myObject[Symbol.iterator]();
it.next();
it.next();
it.next();
for(let v of myObject){
console.log(v);
}