рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рд▓реЗрдЦ рд╣реИред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо js рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкреНрд░рддреАрдХ рдХреНрдпрд╛ рд╣реИ :
рдкреНрд░рддреАрдХ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИред рдкреНрд░рддреАрдХ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ , рдЗрд╕реЗ рдкреНрд░рддреАрдХ ('рдлреВ') рднреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд╛рди рд▓реЗрдмрд▓ рд╡рд╛рд▓реЗ рдЪрд┐рд╣реНрди рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреЛрдИ рднреА рдкреНрд░рддреАрдХ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ)ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рддреАрдХ рд╣реИрдВред рдкреНрд░рддреАрдХ, Symbol.toPrimitive рдФрд░ рдЕрдиреНрдпред рд╕рд┐рд╕реНрдЯрдо рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рддреАрдХ es6 рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдЕрд░реНрдерд╛рдд, рдмрд┐рд▓реНрдХреБрд▓ ( caniuse ) рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рдкреНрд░рддреАрдХ рдЪрд┐рд╣реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдореВрд▓ рд░реВрдк рд╕реЗ, рдЗрд╕ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рдкрд░ рд▓реВрдк рдХреЗ ... рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
const rangeIterator = '0123456789'[Symbol.iterator](); console.log(rangeIterator.next());
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ String.prototype рдХрд╛ рдЕрдкрдирд╛ рдЗрдЯрд┐рдЯрд░ ( рдпреБрдХреНрддрд┐ ) рд╣реИред Js рдореЗрдВ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА: рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдПрд░реЗ, рдЯрд╛рдЗрдкрдПрдбреНрд░реЗ, рдореИрдк, рд╕реЗрдЯред
рд▓реВрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рдореНрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдореЗрдВ Symbol.iterator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░, рдЙрдкрдЬ , рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ ред
рдХреЙрд▓рд┐рдВрдЧ [Symbol.iterator] () рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
Iterator { next();
.Next (), .return (), .throw () рддрд░реАрдХреЗ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (рддрдм рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ) рдФрд░ рдлреЙрд░реНрдо рдХреА рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ:
{ value - , done - }
.Return () рдФрд░ .throw () рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХреНрдорд╛рд╕реНрдореИрдЯ рдпреБрдХреНрддрд┐ рдореЗрдВ рд╣реИрдВред
рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ Symbol.iterator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдЗрдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ... рдФрд░ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд╕рд╛рде Symbol.iterator рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рднреА рджреЗрдЦреЗрдВред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдорд╛рд░реНрдЧ рд╣реИ, рдФрд░ рд╣рдо рдорд╛рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред
рдПрдХ рд░реВрдЯ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ:
class Route { stations;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░рд╛ рд░реВрдЯ Symbol.iterator рдкрджреНрдзрддрд┐ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдорд╛рд░реНрдЧ рдПрдХ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдЗрдХрд╛рдИ ( рдпреБрдХреНрддрд┐ ) рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ ... ( рдорд╛рд░реНрдЧ рдХреЗ рдмрд╛рдж рд╣рдо рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
[Symbol.iterator] () рд╡рд┐рдзрд┐ рдХреЛ рдХрдИ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣реА рд╣реИ, рдпрджрд┐ рдХрдИ рдЪрдХреНрд░ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдорд╛рд░реНрдЧ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪрдХреНрд░ рдХреЗ рд▓рд┐рдП [Symbol.iterator] () рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╣рдо рд░реВрдЯрдЗрдВрдЯрд░реЗрдЯрд░ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ ред
рдЪрд▓рд┐рдП рдЕрдм рдЦреБрдж рд╣реА рд░реВрдЯ рдЖрдИрдЯрд░ рдХреЛ рдЬрд╛рди рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд░реНрдЧ рдПрдХ рд░реВрдЯ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВ:
class RouteIterator { _route;
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕рдВрдЧреНрд░рд╣ ( рдорд╛рд░реНрдЧ рд╕рдВрдкрддреНрддрд┐) рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде nextIdx рд╣рдорд╛рд░реЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЕрдЧрд▓реЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред
рдорд╛рд░реНрдЧ рдХреА рдЬрд╛рдБрдЪ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЕрдЧрд▓рд╛ () рддрд░реАрдХрд╛ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдБ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо рдорд╛рд░реНрдЧ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдЕрдЧрд▓рд╛ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпрд╛рдВ рдкреВрд░реА рдирд╣реАрдВ рд╣реБрдИ рд╣реИрдВ, рд╕реВрдЪрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВред
рдЕрдм рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ...
const route = new Route(['', '', '']) for (let item of route) { console.log(item); }
рдпрд╣ рдХреЛрдб рдЙрди рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рд░реВрдЯ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред
рдЕрдм рд╣рдо рдлрдВрдХреНрд╢рди рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреЗрд╢рдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗ :
function* gen() { yield* route; return 'x';
Symbol.iterator рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрдирд░реНрдЧрдарди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
const [a, b, c] = route;
рдФрд░ рдкреНрд░рд╕рд╛рд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде:
function test(a, b, c) { console.log(a, b, c) } test(тАжroute)
рдкрд░рд┐рдгрд╛рдо
рд╣рдордиреЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдмрдирд╛рдИ, рдЗрд╕реЗ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдпрд╛ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж =)ред
рд╕рд╛рдордЧреНрд░реА
рдХреЗрд╡рд▓ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдирдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рд╕реНрдЯрд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрдВ:
рдЧреБрд░реБ рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдкреБрд╕реНрддрдХ рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЗрд▓рд┐рдпрд╛ рдХреИрдВрдЯрд░ рдХреА рдХрд┐рддрд╛рдм рдФрд░ рдПрдордбреАрдПрди рдкрд░ рдкреНрд░рддреАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ