JavaScript 可迭代对象
可迭代对象时可以使用for..of 进行迭代的对象
从技术上讲,可迭代对象必须实现Symbol.iterator方法。
遍历字符串
你可以使用for..of循环来遍历字符串的元素:
for(const x of "W3School") { // 要执行的代码块 }
遍历数组
你可以使用for..of 循环遍历数组中的元素:
for(const x of [1,2,3,4,5]) { //要执行的代码块 }
Javascript 迭代器
迭代器协议定义了如何从一个对象中生成一系列的值。
当一个对象实现了next() 方法时,它就成为了一个迭代器。
next()方法必须返回一个带有两个属性的对象:
value(下一个值)
done(true或false)
自制的可迭代对象
这个可迭代对象会无线返回:10,20,30,40......当每次调用next()时:
function myNumbers() { let n = 0; return { next: function() { n += 10; return { value: n, done: false }; } }; } const n = myNumbers(); n.next(); // Returns 10 n.next(); // Returns 20 n.next(); // Returns 30
这里的可迭代对象存在问题,它不支持Javascript 中的for..of语句。
Javascript中的可迭代对象是具有Symbol,iterator 属性的对象。
Symbol.iterator是一个返回next 函数的函数。
可以使用一下代码迭代可迭代对象: for (const x of iteralbe){ }
myNumbers = {}; // 创建对象 //使其可迭代 myNumbers[Symbol.iterator] = function(){ let n = 0; done = false; return { next(){ n += 10; if(n == 100){ done = true } return { value: n, done: done }; } }; }
现在可以使用for .. of 了:
for (const num of myNumbers) { //这里可写任何代码 }
Symbol.iterator 方法会被for..of 自动调用。
我们也可以手动调用它:
let iterator = myNumbers[Symbol.iterator](); while(true) { const result= iterator.next(); if(result.done) break; // 这里可写任何代码 }