Object 遍历的方法
- for ... in 用于对象或基础的可访问属性的遍历,适合处理对象
a: for-in 取key并且会返回字符串类型,不管key是否为字符串
b: 遍历数字键,也会遍历非数字键或其他属性
c: 返回key在迭代中不保证返回的顺序,不如 for-of
in 不是像 of 那样有迭代器属性,但是可以访问可枚举的属性. 在对象可见的属性都会被遍历.
- ES6 借鉴 C++、Java、C# 和 Python 语言,引入了
for...of
循环,作为遍历所有数据结构的统一的方法。
一个数据结构只要部署了Symbol.iterator
属性,就被视为具有 iterator 接口,就可以用for...of
循 环,for...of
循环内部调用的是数据结构的Symbol.iterator
方法。
for of 读取键值(适合处理数组),for in 读取键名.
a: 直接取值简洁高效
b: 比forEach不同,可以使用continue break *return(只可以在函数中使用). forEach在return中无效--
c: 被认为是遍历大部分数据结果的统一操作接口
类数组 可以用 for-of 处理
String 字符串
DOM NodeList 节点列表
arguments 函数参数
set Set
map Map
使用 for-of 处理对象 需要先进行预处理
entries() 转为迭代器对象 用of访问,返回值带有index
Object.prototype.toString.call( arr.entries())
// "[object Array Iterator]" 类型名称特殊
keys() 先获取一个key的数组,基于数组进行对象遍历
- * 特殊处理,使用生成器将迭代器或者数组循环中的值,分步返回,在用循环迭代,迭代器方式返回key。
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
}
- Object.keys(obj),返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性).
和 for in 方式遍历的结果一致
- Object.getOwnPropertyNames(obj),返回一个数组,包含对象自身的所有属性
- Object.getOwnPropertySymbols(obj),返回一个数组,包含对象自身的所有Symbol属性.
- Reflect.ownKeys(obj),返回一个数组,包含对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举.