ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性。
或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。
默认了部署了Iterator的数据有:
Array Map Set String 类数组对象 TypedArray arguments NodeList对象
一个对象要想被for…of遍历,必须部署Iterator,或者在其原型上部署Iterator,普通对象并没有部署Iterator,如果用for…of遍历,会抛出“not iterable”错误
那么普通对象到底要怎样才能被for…of遍历?
1、利用Object.keys得到对象的键名然后遍历这个数组
for (var key of Object.keys(someObject)) {
console.log(key + ': ' + someObject[key]);
}
2、Iterator的遍历过程看着像Generator,Generator可以很简单就实现Iterator接口,所以第二种方法就是利用Generator方法将对象包装一下
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
}
for (let [key, value] of entries(obj)) {
console.log(key, '->', value);
tips:什么是类数组对象
avaScript中,数组是一个特殊的对象,其property名为正整数,且其length属性会随着数组成员的增减而发生变化,同时又从Array构造函数中继承了一些用于进行数组操作的方法。
而对于一个普通的对象来说,如果它的所有property名均为正整数,同时也有相应的length属性,那么虽然该对象并不是由Array构造函数所创建的,它依然呈现出数组的行为,在这种情况下,这些对象被称为“类数组对象”。
可以使用数组中的方法,例如可以使用slice()方法获取类数组对象上的子数组,可以使用join方法来连接成为数组。
注意:
在浏览器环境中,document.getElementsByTagName()语句返回的就是一个类数组对象。
在function调用中,function代码内的arguments变量(保存传入的参数)也是一个类数组对象。