1
在ES6中,有沒有可能克隆一個迭代器狀態?如何在JavaScript中克隆迭代器?
var ma=[1,2,3,4];
var it=ma[Symbol.iterator]();
it.next();
如果我想在這裏記住它說明我應該怎麼做javascritp?
什麼是在它裏面? 自
JSON.stringify(it) //it would just return {}
在ES6中,有沒有可能克隆一個迭代器狀態?如何在JavaScript中克隆迭代器?
var ma=[1,2,3,4];
var it=ma[Symbol.iterator]();
it.next();
如果我想在這裏記住它說明我應該怎麼做javascritp?
什麼是在它裏面? 自
JSON.stringify(it) //it would just return {}
您無法克隆任意迭代器,但你可以從一個由持有到一些國家創造了許多不同的迭代器:
function tee(iterable) {
const source = iterable[Symbol.iterator]();
const buffers = [[], []]; // substitute in queue type for efficiency
const DONE = Object.create(null);
const next = i => {
if (buffers[i].length !== 0) {
return buffers[i].shift();
}
const x = source.next();
if (x.done) {
return DONE;
}
buffers[1 - i].push(x.value);
return x.value;
};
return buffers.map(function* (_, i) {
for (;;) {
const x = next(i);
if (x === DONE) {
break;
}
yield x;
}
});
}
用法:
const [a, b] = tee(iterator);
assert(a.next().value === b.next().value);
不可能克隆迭代器。迭代器狀態基本上是完全任意的,任何給定的迭代器可能需要或產生副作用(例如從網絡流讀取或寫入網絡流),這些副作用是不可重複的。