Я нашел код в Интернете. Я раздавил исходный код в этот небольшой отрывок, который при запуске напечатает 1-20 на консоли.В чем смысл * [Symbol.iterator] в этом контексте
var NumbersFromOne = {
*[Symbol.iterator]() {
for (let i = 1;; ++i) yield i;
}
};
var take = function* (numberToTake, iterable) {
let remaining = numberToTake;
for (let value of NumbersFromOne) {
if (remaining-- <= 0) break;
yield value;
}
}
var printToTwenty = take(20, NumbersFromOne)
console.log(...printToTwenty);
Теперь я понимаю, что take() является функцией GeneratorFunction.
Когда вызывается take(), ему присваивается итератор.
Код «... printToTwenty» использует оператор спреда для итерации по этой функции.
Я понимаю, что NumbersFromOne - это объект. Я пришел сюда в поисках объяснения того, что эта часть означает:
*[Symbol.iterator]() {}
Объявление функций генератора осуществляется следующим образом: функция *() {}
Таким образом, я предполагаю, что это не возможность объявления функция генератора.
* также не представляет имя функции
* также не может быть заменен другим оператором (/, -, +)
Что такое сделка с этим синтаксисом, и почему это * перед тем [Symbol.iterator]
Если после этого он не будет запущен.
Я считал, что * [Symbol.iterator]() - это способ переписать существующее свойство итератора, но тогда он не сказал бы это [Symbol.iterator].
Спасибо!
Мне нравится этот ответ. Я хочу отметить, что * должен прийти после функции. Я сделал jsfiddle, чтобы продемонстрировать: http://www.es6fiddle.net/inpoxsps/ Я не знал, что это короткая нотация. Благодарим вас за разъяснение. – Captainlonate
Упс, моё плохо, спасибо, что указали это. У меня еще не было возможности написать все, что есть у многих реальных генераторов.Теперь он должен работать :) – nils
Привет, Нилс. Зачем нужны два итератора здесь, возьмите & numbersfromone. Take кажется излишним, если вы можете просто получить диапазон в цифрах, не так ли? –