ÐеÑебиÑаемÑе (или иÑеÑиÑÑемÑе) обÑекÑÑ â ÑÑо обобÑение маÑÑивов. ÐонÑепÑиÑ, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð»Ñбой обÑÐµÐºÑ Ð² Ñикле for..of.
ÐонеÑно же, Ñами маÑÑÐ¸Ð²Ñ ÑвлÑÑÑÑÑ Ð¿ÐµÑебиÑаемÑми обÑекÑами. Ðо еÑÑÑ Ð¸ много дÑÑÐ³Ð¸Ñ Ð²ÑÑÑоеннÑÑ Ð¿ÐµÑебиÑаемÑÑ Ð¾Ð±ÑекÑов, напÑимеÑ, ÑÑÑоки.
ÐÑли обÑÐµÐºÑ Ð½Ðµ ÑвлÑеÑÑÑ Ð¼Ð°ÑÑивом, но пÑедÑÑавлÑÐµÑ Ñобой коллекÑÐ¸Ñ ÐºÐ°ÐºÐ¸Ñ
-Ñо ÑлеменÑов (ÑпиÑок, набоÑ), Ñо Ñдобно иÑполÑзоваÑÑ Ñикл for..of Ð´Ð»Ñ Ð¸Ñ
пеÑебоÑа, Ñак ÑÑо давайÑе поÑмоÑÑим, как ÑÑо ÑделаÑÑ.
Symbol.iterator
ÐÑ Ð»ÐµÐ³ÐºÐ¾ поймÑм пÑинÑип ÑÑÑÑойÑÑва пеÑебиÑаемÑÑ Ð¾Ð±ÑекÑов, Ñоздав один из Ð½Ð¸Ñ .
ÐапÑимеÑ, Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð¾Ð±ÑекÑ. ÐÑо не маÑÑив, но он вÑглÑÐ´Ð¸Ñ Ð¿Ð¾Ð´Ñ
одÑÑим Ð´Ð»Ñ for..of.
ÐапÑимеÑ, обÑÐµÐºÑ range, коÑоÑÑй пÑедÑÑавлÑÐµÑ Ñобой диапазон ÑиÑел:
let range = {
from: 1,
to: 5
};
// ÐÑ Ñ
оÑим, ÑÑÐ¾Ð±Ñ ÑабоÑал for..of:
// for(let num of range) ... num=1,2,3,4,5
ЧÑÐ¾Ð±Ñ ÑделаÑÑ range иÑеÑиÑÑемÑм (и позволиÑÑ for..of ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼), нам нÑжно добавиÑÑ Ð² обÑÐµÐºÑ Ð¼ÐµÑод Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Symbol.iterator (ÑпеÑиалÑнÑй вÑÑÑоеннÑй Symbol, ÑозданнÑй как Ñаз Ð´Ð»Ñ ÑÑого).
- Ðогда Ñикл
for..ofзапÑÑкаеÑÑÑ, он вÑзÑÐ²Ð°ÐµÑ ÑÑÐ¾Ñ Ð¼ÐµÑод один Ñаз (или вÑдаÑÑ Ð¾ÑибкÑ, еÑли меÑод не найден). ÐÑÐ¾Ñ Ð¼ÐµÑод должен веÑнÑÑÑ Ð¸ÑеÑаÑÐ¾Ñ â обÑÐµÐºÑ Ñ Ð¼ÐµÑодомnext. - ÐалÑÑе
for..ofÑабоÑÐ°ÐµÑ ÑолÑко Ñ ÑÑим возвÑаÑÑннÑм обÑекÑом. - Ðогда
for..ofÑ Ð¾ÑÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÑледÑÑÑее знаÑение, он вÑзÑÐ²Ð°ÐµÑ Ð¼ÐµÑодnext()ÑÑого обÑекÑа. - РезÑлÑÑÐ°Ñ Ð²Ñзова
next()должен имеÑÑ Ð²Ð¸Ð´{done: Boolean, value: any}, гдеdone=trueознаÑаеÑ, ÑÑо Ñикл завеÑÑÑн, в пÑоÑивном ÑлÑÑаеvalueÑодеÑÐ¶Ð¸Ñ Ð¾ÑеÑедное знаÑение.
ÐÐ¾Ñ Ð¿Ð¾Ð»Ð½Ð°Ñ ÑеализаÑÐ¸Ñ range Ñ Ð¿Ð¾ÑÑнениÑми:
let range = {
from: 1,
to: 5
};
// 1. вÑзов for..of ÑнаÑала вÑзÑÐ²Ð°ÐµÑ ÑÑÑ ÑÑнкÑиÑ
range[Symbol.iterator] = function() {
// ...она возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¸ÑеÑаÑоÑа:
// 2. Ðалее, for..of ÑабоÑÐ°ÐµÑ ÑолÑко Ñ ÑÑим иÑеÑаÑоÑом,
// запÑаÑÐ¸Ð²Ð°Ñ Ñ Ð½ÐµÐ³Ð¾ новÑе знаÑениÑ
return {
current: this.from,
last: this.to,
// 3. next() вÑзÑваеÑÑÑ Ð½Ð° каждой иÑеÑаÑии Ñикла for..of
next() {
// 4. он должен веÑнÑÑÑ Ð·Ð½Ð°Ñение в виде обÑекÑа {done:.., value :...}
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
// ÑепеÑÑ ÑабоÑаеÑ!
for (let num of range) {
alert(num); // 1, заÑем 2, 3, 4, 5
}
ÐбÑаÑиÑе внимание на клÑÑевÑÑ Ð¾ÑобенноÑÑÑ Ð¸ÑеÑаÑоÑов: Ñазделение оÑвеÑÑÑвенноÑÑи.
- У Ñамого
rangeÐ½ÐµÑ Ð¼ÐµÑодаnext(). - ÐмеÑÑо ÑÑого дÑÑгой обÑекÑ, Ñак назÑваемÑй «иÑеÑаÑоÑ», ÑоздаÑÑÑÑ Ð²Ñзовом
range[Symbol.iterator](), и именно егоnext()генеÑиÑÑÐµÑ Ð·Ð½Ð°ÑениÑ.
Таким обÑазом, обÑÐµÐºÑ Ð¸ÑеÑаÑÐ¾Ñ Ð¾ÑделÑн Ð¾Ñ Ñамого иÑеÑиÑÑемого обÑекÑа.
ТеÑ
ниÑеÑки Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ обÑединиÑÑ Ð¸Ñ
и иÑполÑзоваÑÑ Ñам range как иÑеÑаÑоÑ, ÑÑÐ¾Ð±Ñ ÑпÑоÑÑиÑÑ ÐºÐ¾Ð´.
ÐапÑимеÑ, Ð²Ð¾Ñ Ñак:
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
alert(num); // 1, заÑем 2, 3, 4, 5
}
ТепеÑÑ range[Symbol.iterator]() возвÑаÑÐ°ÐµÑ Ñам обÑÐµÐºÑ range: Ñ Ð½ÐµÐ³Ð¾ еÑÑÑ Ð½ÐµÐ¾Ð±Ñ
одимÑй меÑод next(), и он Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑ ÑекÑÑее ÑоÑÑоÑние иÑеÑаÑии в this.current. ÐоÑоÑе? Ðа. Риногда Ñакой ÑпоÑоб Ñоже Ñ
оÑоÑ.
ÐедоÑÑаÑок Ñакого подÑ
ода в Ñом, ÑÑо ÑепеÑÑ Ð¼Ñ Ð½Ðµ можем иÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ð² двÑÑ
паÑаллелÑнÑÑ
ÑиклаÑ
for..of: Ñ Ð½Ð¸Ñ
бÑÐ´ÐµÑ Ð¾Ð±Ñее ÑекÑÑее ÑоÑÑоÑние иÑеÑаÑии, поÑÐ¾Ð¼Ñ ÑÑо ÑепеÑÑ ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ÑÑ Ð¾Ð´Ð¸Ð½ иÑеÑаÑÐ¾Ñ â Ñам обÑекÑ. Ðо необÑ
одимоÑÑÑ Ð² двÑÑ
ÑиклаÑ
for..of, вÑполнÑемÑÑ
одновÑеменно, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ñедко, даже пÑи налиÑии аÑинÑ
ÑоннÑÑ
опеÑаÑий.
Ðожно ÑделаÑÑ Ð±ÐµÑконеÑнÑй иÑеÑаÑоÑ. ÐапÑимеÑ, range бÑÐ´ÐµÑ Ð±ÐµÑконеÑнÑм пÑи range.to = Infinity. Ðли Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ð¸ÑеÑиÑÑемÑй обÑекÑ, коÑоÑÑй генеÑиÑÑÐµÑ Ð±ÐµÑконеÑнÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð¿ÑевдоÑлÑÑайнÑÑ
ÑиÑел. ÐÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾.
ÐеÑод next не Ð¸Ð¼ÐµÐµÑ Ð¾Ð³ÑаниÑений, он Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑаÑÑ Ð²ÑÑ Ð½Ð¾Ð²Ñе и новÑе знаÑениÑ, ÑÑо ноÑмалÑно.
ÐонеÑно же, Ñикл for..of Ñ Ñаким иÑеÑиÑÑемÑм обÑекÑом бÑÐ´ÐµÑ Ð±ÐµÑконеÑнÑм. Ðо Ð¼Ñ Ð²Ñегда можем пÑеÑваÑÑ ÐµÐ³Ð¾, иÑполÑзÑÑ break.
СÑÑока â пеÑебиÑаемÑй обÑекÑ
СÑеди вÑÑÑоеннÑÑ Ð¿ÐµÑебиÑаемÑÑ Ð¾Ð±ÑекÑов наиболее ÑиÑоко иÑполÑзÑÑÑÑÑ Ð¼Ð°ÑÑÐ¸Ð²Ñ Ð¸ ÑÑÑоки.
ÐÐ»Ñ ÑÑÑоки for..of пеÑебиÑÐ°ÐµÑ ÑимволÑ:
for (let char of "test") {
// ÑÑабаÑÑÐ²Ð°ÐµÑ 4 Ñаза: по Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñимвола
alert( char ); // t, заÑем e, заÑем s, заÑем t
}
Рон ÑабоÑÐ°ÐµÑ ÐºÐ¾ÑÑекÑно даже Ñ ÑÑÑÑогаÑнÑми паÑами!
let str = 'ð³ð';
for (let char of str) {
alert( char ); // ð³, а заÑем ð
}
ЯвнÑй вÑзов иÑеÑаÑоÑа
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ ÑÑÑÑойÑÑво иÑеÑаÑоÑов ÑÑÑÑ Ð³Ð»Ñбже, давайÑе поÑмоÑÑим, как Ð¸Ñ Ð¸ÑполÑзоваÑÑ Ñвно.
ÐÑ Ð±Ñдем пеÑебиÑаÑÑ ÑÑÑÐ¾ÐºÑ ÑоÑно Ñак же, как Ñикл for..of, но вÑÑÑнÑÑ, пÑÑмÑми вÑзовами. ÐижепÑиведÑннÑй код полÑÑÐ°ÐµÑ ÑÑÑоковÑй иÑеÑаÑÐ¾Ñ Ð¸ беÑÑÑ Ð¸Ð· него знаÑениÑ:
let str = "Hello";
// Ð´ÐµÐ»Ð°ÐµÑ Ñо же Ñамое, ÑÑо и
// for (let char of str) alert(char);
let iterator = str[Symbol.iterator]();
while (true) {
let result = iterator.next();
if (result.done) break;
alert(result.value); // вÑÐ²Ð¾Ð´Ð¸Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¾Ð´Ð¸Ð½ за дÑÑгим
}
Такое Ñедко бÑÐ²Ð°ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимо, но ÑÑо даÑÑ Ð½Ð°Ð¼ болÑÑе конÑÑÐ¾Ð»Ñ Ð½Ð°Ð´ пÑоÑеÑÑом, Ñем for..of. ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑазбиÑÑ Ð¿ÑоÑеÑÑ Ð¸ÑеÑаÑии на ÑаÑÑи: пеÑебÑаÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ ÑлеменÑов, заÑем оÑÑановиÑÑÑÑ, ÑделаÑÑ ÑÑо-Ñо еÑÑ Ð¸ поÑом пÑодолжиÑÑ.
ÐÑеÑиÑÑемÑе обÑекÑÑ Ð¸ пÑевдомаÑÑивÑ
ÐÑÑÑ Ð´Ð²Ð° оÑиÑиалÑнÑÑ ÑеÑмина, коÑоÑÑе оÑÐµÐ½Ñ Ð¿Ð¾Ñ Ð¾Ð¶Ð¸, но в Ñо же вÑÐµÐ¼Ñ ÑилÑно ÑазлиÑаÑÑÑÑ. ÐоÑÑÐ¾Ð¼Ñ ÑбедиÑеÑÑ, ÑÑо Ð²Ñ ÐºÐ°Ðº ÑледÑÐµÑ Ð¿Ð¾Ð½Ñли Ð¸Ñ , ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð¿ÑÑаниÑÑ.
- ÐÑеÑиÑÑемÑе обÑекÑÑ â ÑÑо обÑекÑÑ, коÑоÑÑе ÑеализÑÑÑ Ð¼ÐµÑод
Symbol.iterator, как бÑло опиÑано вÑÑе. - ÐÑевдомаÑÑÐ¸Ð²Ñ â ÑÑо обÑекÑÑ, Ñ ÐºÐ¾ÑоÑÑÑ
еÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¸ ÑвойÑÑво
length, Ñо еÑÑÑ, они вÑглÑдÑÑ ÐºÐ°Ðº маÑÑивÑ.
ÐÑи иÑполÑзовании JavaScript в бÑаÑзеÑе или дÑÑÐ³Ð¸Ñ Ð¾ÐºÑÑжениÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑÑÑеÑиÑÑ Ð¾Ð±ÑекÑÑ, коÑоÑÑе ÑвлÑÑÑÑÑ Ð¸ÑеÑиÑÑемÑми или пÑевдомаÑÑивами, или и Ñем, и дÑÑгим.
ÐапÑимеÑ, ÑÑÑоки иÑеÑиÑÑÐµÐ¼Ñ (Ð´Ð»Ñ Ð½Ð¸Ñ
ÑабоÑÐ°ÐµÑ for..of) и ÑвлÑÑÑÑÑ Ð¿ÑевдомаÑÑивами (они индекÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¸ еÑÑÑ length).
Ðо иÑеÑиÑÑемÑй обÑÐµÐºÑ Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ Ð¿ÑевдомаÑÑивом. РнаобоÑоÑ: пÑевдомаÑÑив Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ Ð¸ÑеÑиÑÑемÑм.
ÐапÑимеÑ, обÑÐµÐºÑ range из пÑимеÑа вÑÑе â иÑеÑиÑÑемÑй, но не ÑвлÑеÑÑÑ Ð¿ÑевдомаÑÑивом, поÑÐ¾Ð¼Ñ ÑÑо Ñ Ð½ÐµÐ³Ð¾ Ð½ÐµÑ Ð¸Ð½Ð´ÐµÐºÑиÑованнÑÑ
ÑвойÑÑв и length.
Ð Ð²Ð¾Ñ Ð¾Ð±ÑекÑ, коÑоÑÑй ÑвлÑеÑÑÑ Ð¿ÑевдомаÑÑивом, но его нелÑÐ·Ñ Ð¸ÑеÑиÑоваÑÑ:
let arrayLike = { // еÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð¸ ÑвойÑÑво length => пÑевдомаÑÑив
0: "Hello",
1: "World",
length: 2
};
// ÐÑибка (оÑÑÑÑÑÑвÑÐµÑ Symbol.iterator)
for (let item of arrayLike) {}
ЧÑо Ñ Ð½Ð¸Ñ
обÑего? РиÑеÑиÑÑемÑе обÑекÑÑ, и пÑевдомаÑÑÐ¸Ð²Ñ â ÑÑо обÑÑно не маÑÑивÑ, Ñ Ð½Ð¸Ñ
Ð½ÐµÑ Ð¼ÐµÑодов push, pop и Ñ.д. ÐоволÑно неÑдобно, еÑли Ñ Ð½Ð°Ñ ÐµÑÑÑ Ñакой обÑÐµÐºÑ Ð¸ Ð¼Ñ Ñ
оÑим ÑабоÑаÑÑ Ñ Ð½Ð¸Ð¼ как Ñ Ð¼Ð°ÑÑивом. ÐапÑимеÑ, Ð¼Ñ Ñ
оÑели Ð±Ñ ÑабоÑаÑÑ Ñ range, иÑполÑзÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¼Ð°ÑÑивов. Ðак ÑÑого доÑÑиÑÑ?
Array.from
ÐÑÑÑ ÑнивеÑÑалÑнÑй меÑод Array.from, коÑоÑÑй пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ Ð¸Ð»Ð¸ пÑевдомаÑÑив и Ð´ÐµÐ»Ð°ÐµÑ Ð¸Ð· него «наÑÑоÑÑий» Array. ÐоÑле ÑÑого Ð¼Ñ Ñже можем иÑполÑзоваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¼Ð°ÑÑивов.
ÐапÑимеÑ:
let arrayLike = {
0: "Hello",
1: "World",
length: 2
};
let arr = Array.from(arrayLike); // (*)
alert(arr.pop()); // World (меÑод ÑабоÑаеÑ)
Array.from в ÑÑÑоке (*) пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð±ÑекÑ, пÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ он иÑеÑиÑÑемÑм обÑекÑом или пÑевдомаÑÑивом, заÑем ÑоздаÑÑ Ð½Ð¾Ð²Ñй маÑÑив и копиÑÑÐµÑ ÑÑда вÑе ÑлеменÑÑ.
То же Ñамое пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ñ Ð¸ÑеÑиÑÑемÑм обÑекÑом:
// range взÑÑ Ð¸Ð· пÑимеÑа в наÑале ÑÑаÑÑи
let arr = Array.from(range);
alert(arr); // 1,2,3,4,5 (пÑеобÑазование маÑÑива ÑеÑез toString ÑабоÑаеÑ)
ÐолнÑй ÑинÑакÑÐ¸Ñ Array.from позволÑÐµÑ ÑказаÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑÑ Â«ÑÑанÑÑоÑмиÑÑÑÑÑÑ» ÑÑнкÑиÑ:
Array.from(obj[, mapFn, thisArg])
ÐеобÑзаÑелÑнÑй вÑоÑой аÑгÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑнкÑией, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¿Ñименена к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ Ð¿ÐµÑед добавлением в маÑÑив, а thisArg позволÑÐµÑ ÑÑÑановиÑÑ this Ð´Ð»Ñ ÑÑой ÑÑнкÑии.
ÐапÑимеÑ:
// range взÑÑ Ð¸Ð· пÑимеÑа в наÑале ÑÑаÑÑи
// возводим каждое ÑиÑло в квадÑаÑ
let arr = Array.from(range, num => num * num);
alert(arr); // 1,4,9,16,25
ÐдеÑÑ Ð¼Ñ Ð¸ÑполÑзÑем Array.from, ÑÑÐ¾Ð±Ñ Ð¿ÑевÑаÑиÑÑ ÑÑÑÐ¾ÐºÑ Ð² маÑÑив ÐµÑ ÑлеменÑов:
let str = 'ð³ð';
// ÑÐ°Ð·Ð±Ð¸Ð²Ð°ÐµÑ ÑÑÑÐ¾ÐºÑ Ð½Ð° маÑÑив ÐµÑ ÑлеменÑов
let chars = Array.from(str);
alert(chars[0]); // ð³
alert(chars[1]); // ð
alert(chars.length); // 2
РоÑлиÑие Ð¾Ñ str.split, ÑÑÐ¾Ñ Ð¼ÐµÑод в ÑабоÑе опиÑаеÑÑÑ Ð½Ð° иÑеÑиÑÑемоÑÑÑ ÑÑÑоки, и поÑÑомÑ, как и for..of, он коÑÑекÑно ÑабоÑÐ°ÐµÑ Ñ ÑÑÑÑогаÑнÑми паÑами.
Ð¢ÐµÑ Ð½Ð¸ÑеÑки ÑÑо Ñо же Ñамое, ÑÑо и:
let str = 'ð³ð';
let chars = []; // Array.from внÑÑÑи ÑÐµÐ±Ñ Ð²ÑполнÑÐµÑ ÑÐ¾Ñ Ð¶Ðµ Ñикл
for (let char of str) {
chars.push(char);
}
alert(chars);
â¦Ðо гоÑаздо коÑоÑе.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ даже ÑоздаÑÑ slice, коÑоÑÑй поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑÑÑогаÑнÑе паÑÑ:
function slice(str, start, end) {
return Array.from(str).slice(start, end).join('');
}
let str = 'ð³ðð©·¶';
alert( slice(str, 1, 3) ); // ðð©·¶
// а Ð²Ð¾Ñ Ð²ÑÑÑоеннÑй меÑод не поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑÑÑÑогаÑнÑе паÑÑ
alert( str.slice(1, 3) ); // мÑÑÐ¾Ñ (две ÑаÑÑи ÑазлиÑнÑÑ
ÑÑÑÑогаÑнÑÑ
паÑ)
ÐÑого
ÐбÑекÑÑ, коÑоÑÑе можно иÑполÑзоваÑÑ Ð² Ñикле for..of, назÑваÑÑÑÑ Ð¸ÑеÑиÑÑемÑми.
- ТеÑ
ниÑеÑки иÑеÑиÑÑемÑе обÑекÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¼ÐµÑод
Symbol.iterator.- РезÑлÑÑÐ°Ñ Ð²Ñзова
obj[Symbol.iterator]назÑваеÑÑÑ Ð¸ÑеÑаÑоÑом. Ðн ÑпÑавлÑÐµÑ Ð¿ÑоÑеÑÑом иÑеÑаÑии. - ÐÑеÑаÑÐ¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¼ÐµÑод
next(), коÑоÑÑй возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑекÑ{done: Boolean, value: any}, гдеdone:trueÑигнализиÑÑÐµÑ Ð¾Ð± оконÑании пÑоÑеÑÑа иÑеÑаÑии, в пÑоÑивном ÑлÑÑаеvalueâ ÑледÑÑÑее знаÑение.
- РезÑлÑÑÐ°Ñ Ð²Ñзова
- ÐеÑод
Symbol.iteratorавÑомаÑиÑеÑки вÑзÑваеÑÑÑ Ñикломfor..of, но можно вÑзваÑÑ ÐµÐ³Ð¾ и напÑÑмÑÑ. - ÐÑÑÑоеннÑе иÑеÑиÑÑемÑе обÑекÑÑ, Ñакие как ÑÑÑоки или маÑÑивÑ, Ñакже ÑеализÑÑÑ Ð¼ÐµÑод
Symbol.iterator. - СÑÑоковÑй иÑеÑаÑÐ¾Ñ Ð·Ð½Ð°ÐµÑ Ð¿Ñо ÑÑÑÑогаÑнÑе паÑÑ.
ÐбÑекÑÑ, имеÑÑие индекÑиÑованнÑе ÑвойÑÑва и length, назÑваÑÑÑÑ Ð¿ÑевдомаÑÑивами. Ðни Ñакже могÑÑ Ð¸Ð¼ÐµÑÑ Ð´ÑÑгие ÑвойÑÑва и меÑодÑ, но Ñ Ð½Ð¸Ñ
Ð½ÐµÑ Ð²ÑÑÑоеннÑÑ
меÑодов маÑÑивов.
ÐÑли Ð¼Ñ Ð·Ð°Ð³Ð»Ñнем в ÑпеÑиÑикаÑиÑ, Ð¼Ñ Ñвидим, ÑÑо болÑÑинÑÑво вÑÑÑоеннÑÑ Ð¼ÐµÑодов ÑаÑÑÑиÑÑваÑÑ Ð½Ð° Ñо, ÑÑо они бÑдÑÑ ÑабоÑаÑÑ Ñ Ð¸ÑеÑиÑÑемÑми обÑекÑами или пÑевдомаÑÑивами вмеÑÑо «наÑÑоÑÑÐ¸Ñ Â» маÑÑивов, поÑÐ¾Ð¼Ñ ÑÑо ÑÑи обÑекÑÑ Ð±Ð¾Ð»ÐµÐµ абÑÑÑакÑнÑ.
Array.from(obj[, mapFn, thisArg]) ÑоздаÑÑ Ð½Ð°ÑÑоÑÑий Array из иÑеÑиÑÑемого обÑекÑа или пÑевдомаÑÑива obj, и заÑем Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑименÑÑÑ Ðº Ð½ÐµÐ¼Ñ Ð¼ÐµÑÐ¾Ð´Ñ Ð¼Ð°ÑÑивов. ÐеобÑзаÑелÑнÑе аÑгÑменÑÑ mapFn и thisArg позволÑÑÑ Ð¿ÑименÑÑÑ ÑÑнкÑÐ¸Ñ Ñ Ð·Ð°Ð´Ð°Ð²Ð°ÐµÐ¼Ñм конÑекÑÑом к ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)