1. 在ES6中,数组、Set、Map、字符串都是可迭代对象。
2. 默认情况下定义的对象(Object)是不可迭代的,但是可以通过Symbol.Iterator创建迭代器。
Set
var arr = ["红","黄","蓝","红"]
var res = new Set(arr);
console.log(res) //Set(3) {"红", "黄", "蓝"}
输出结果:
可以看到Set()方法有点类似数组去重的效果,不过返回结果是可迭代的对象形式。
Map
var person = new Map();
person.set("name","张三")
person.set("age","18")
person.set("sex","男")
console.log(person)
for(let [key,value] of person){
console.log(key+'-',value)
}
输出结果:
Object
// object不可迭代demo
var Student = {
name:"张三",
age:18,
sex:"男"
}
for (let s of Student) {
console.log(s)
}
输出结果:
以上用例可以看出Object是不可迭代的,但是我们可以通过Symbol.Iterator创建迭代器
// 为Student创建迭代器
var Student = {
name:"张三",
age:18,
sex:"男",
*[Symbol.iterator](){ //*表示该函数为生成器
for (let key in this) {
yield [key,this[key]] //yield 用于返回值给生成器
}
}
}
console.log(Student)
for (let [key,value] of Student) {
console.log(key+'-',value)
}
输出结果:
以上结果表明通过我们为Student
对象手动创建的生成器即可实现对象的迭代,且迭代方式可以自定义。
数组、Set、Map都是可迭代对象,即它们内部实现了迭代器,且提供了3种迭代器函数调用
entries()返回迭代器:返回键值对
// 数组
var arr = ["红","黄","蓝","红"]
for (let [key,value] of arr.entries()) {
console.log(key+'-',value)
}
console.log('----------end------------')
// Set
var setArr = new Set(arr);
for (let [key,value] of setArr.entries()) {
console.log(key+'-',value)
}
console.log('----------end------------')
// Map
var person = new Map();
person.set("name","张三")
person.set("age","18")
person.set("sex","男")
for(let [key,value] of person.entries()){
console.log(key+'-',value)
}
输出结果:
values()返回迭代器:返回键值对的value
// 数组
var arr = ["红","黄","蓝","红"]
for (let value of arr.values()) {
console.log(value) // 红,黄,蓝,红
}
keys()返回迭代器:返回键值对的key
// 数组
var arr = ["红","黄","蓝","红"]
for (let key of arr.keys()) {
console.log(key) // 0,1,2,3
}