在此简单代码中,console.log(names.next().value);
(如果被调用两次,则增加数组索引)。我不确定它的操作方式,因为我认为它应该始终以0开头,因此应该返回相同的值。
有人可以解释它是如何做到的吗?
// Iterator Example
function nameIterator(names) {
let nextIndex = 0;
console.log(nextIndex);
return {
next: function() {
return nextIndex < names.length ? {
value: names[nextIndex++],
done: false
} : {
done: true
}
}
}
}
// Create an array of names
const namesArr = ['Brad', 'Sara', 'John'];
// Init iterator and pass in the names array
const names = nameIterator(namesArr);
console.log(names.next().value);
console.log(names.next().value);
console.log(names.next().value);
console.log(names.next());
输出:
Brad
Sara
John
Object : {done: true}
答案 0 :(得分:1)
这是因为代码中的以下行。
names[nextIndex++]
此行选择names
值中的索引,然后将nextIndex
的值加1,但仅在选择键之后。在下面的示例中看到它,以查看其输出。
let arr = [1, 2, 3];
let index = 0;
console.log(arr[index++]);
console.log(arr[index++]);
console.log(arr[index++]);
nextIndex
方法时next()
都会递增,并且一直持续到nextIndex
的值达到阈值为止。
答案 1 :(得分:1)
这是因为next()
使用了nextIndex
函数中存在的nameIterator()
属性。
next()
本身没有nextIndex
属性的单独副本。因此,当您在nextIndex++
方法中执行next()
时,它实际上会更新nextIndex
中我们拥有的nameIterator()
,并且下次您调用next()
时,只会访问此更新的nextIndex
。
答案 2 :(得分:1)
每次调用函数next
时,它的索引都会增加1 ->
nextIndex++
。
您可以传递一个标志,指示您想要当前的索引值,如下所示:
// Iterator Example
function nameIterator(names) {
let nextIndex = 0;
return {
next: function(current) {
let index;
if (current) {
index = (nextIndex < names.length ? nextIndex : names.length) - 1;
} else {
index = nextIndex++;
}
return index < names.length ? {
value: names[index],
done: false
} : {
done: true
}
}
}
}
// Create an array of names
const namesArr = ['Brad', 'Sara', 'John'];
// Init iterator and pass in the names array
const names = nameIterator(namesArr);
console.log(names.next().value);
console.log(names.next(true).value);
console.log(names.next(true).value);
console.log(names.next(true).value);
console.log(names.next().value);
console.log(names.next(true).value);
console.log(names.next().value);
console.log(names.next());
console.log(names.next(true).value);
console.log(names.next());