Iterable objects are a generalization of arrays. Thatâs a concept that allows us to make any object useable in a for..of loop.
Of course, Arrays are iterable. But there are many other built-in objects, that are iterable as well. For instance, strings are also iterable.
If an object isnât technically an array, but represents a collection (list, set) of something, then for..of is a great syntax to loop over it, so letâs see how to make it work.
Symbol.iterator
ÙÙ ÙÙÙØ§ Ø£Ù ÙÙÙ٠بسÙÙÙØ© Ù ÙÙÙ٠اÙÙ ØªÙØ±Ø±Ø§Øª ع٠طرÙÙ Ø¥ÙØ´Ø§Ø¡ ÙØ§ØØ¯ بÙÙØ³Ùا.
عÙ٠سبÙ٠اÙÙ
Ø«Ø§ÙØ إذا ÙØ§Ù ÙØ¯ÙÙØ§ ÙØ§Ø¦Ù ÙÙÙÙÙ ÙÙØ³ Ù
صÙÙÙØ©Ø ÙÙÙÙÙ Ù
ÙØ§Ø³Ø¨ ÙÙØªÙرار
for..of
Ù
ث٠اÙÙØ§Ø¦Ù
range
Ø§ÙØ°Ù ÙØ¹Ø±Ø¶ Ù
جÙ
ÙØ¹Ù Ù
Ù Ø§ÙØ£Ø±ÙاÙ
:
let range = {
from: 1,
to: 5,
};
// ÙØ±Ùد Ø£Ù ÙØ¹Ù
Ù Ø§ÙØªÙرار ÙØ§ÙآتÙ:
// for(let num of range) ... num=1,2,3,4,5
To make the range object iterable (and thus let for..of work) we need to add a method to the object named Symbol.iterator (a special built-in symbol just for that).
- When
for..ofstarts, it calls that method once (or errors if not found). The method must return an iterator â an object with the methodnext. - Onward,
for..ofworks only with that returned object. - When
for..ofwants the next value, it callsnext()on that object. - The result of
next()must have the form{done: Boolean, value: any}, wheredone=truemeans that the iteration is finished, otherwisevalueis the next value.
Hereâs the full implementation for range with remarks:
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, then 2, 3, 4, 5
}
ÙØ§ØØ¸ اÙÙ ÙØ²Ø© Ø§ÙØ£Ø³Ø§Ø³ÙÙ ÙÙÙ ØªÙØ±Ø±Ø§Øª: اÙÙØµÙ بÙ٠اÙÙ ÙØ§ÙÙÙ (separation of concerns).
- اÙÙØ§Ø¦Ù
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, then 2, 3, 4, 5
}
ÙØ§Ùآ٠تÙÙÙ
range[Symbol.iterator]()
تÙÙÙ
بإرجاع اÙÙØ§Ø¦Ù
range:
ÙÙÙ ØªØØªÙ٠عÙÙ Ø§ÙØ¯Ø§ÙØ© next() ÙØªÙÙÙ
Ø¨Ø§Ø³ØªØ°ÙØ§Ø± Ø§ÙØ¯Ùرة Ø§ÙØØ§ÙÙØ© ÙÙ this.current. Ø£ÙÙØ³ ÙØ°Ø§ Ø£ÙØµØ± Ø ÙÙ٠بعض Ø§ÙØ£ØÙا٠ÙÙÙÙ Ø¬ÙØ¯Ùا Ø£ÙØ¶Ùا.
Ø¥Ù Ø§ÙØ¹Ùب اÙÙØÙØ¯ Ø§ÙØ¢Ù Ù٠أÙÙ Ù
٠اÙÙ
ستØÙ٠أ٠ÙÙÙÙ ÙÙØ§Ù ØªÙØ±Ø§Ø±ÙÙ Ù
٠اÙÙÙØ¹ for..of ÙØ¹Ù
ÙØ§Ù عÙÙ ÙÙØ³ اÙÙØ§Ø¦Ù ÙÙ ÙÙØ³ اÙÙÙØª: ØÙØ« Ø£Ù ÙÙ Ø§ÙØªÙرارات ÙØªØ´Ø§Ø±ÙÙÙ ÙÙØ³ ØØ§ÙØ© Ø§ÙØªÙرار â ÙÙ٠اÙÙØ§Ø¦Ù ÙÙØ³Ù. ÙÙÙÙ ÙØ¬Ùد ØªÙØ±Ø§Ø±ÙÙ ÙØ¹Ù
ÙØ§Ù ÙÙ ÙÙØ³ اÙÙÙØª عÙÙ ÙÙØ³ اÙÙØ§Ø¦Ù ÙÙ ØØ§ÙØ© ÙØ§Ø¯Ø±Ø© ØØªÙ ÙÙ Ø§ÙØØ§ÙØ§Øª اÙÙ
تزاÙ
ÙØ©.
Ø§ÙØªÙرارات Ø§ÙØºÙر ÙØªÙÙØ© Ù
Ù
ÙÙØ© Ø£ÙØ¶Ùا. ÙØ¹Ù٠سبÙ٠اÙÙ
Ø«Ø§ÙØ Ø³ÙØµØ¨Ø اÙÙØ§Ø¦Ù range ØºÙØ± Ù
ÙØªÙÙ Ø¹ÙØ¯Ù
ا range.to = Infinity. Ø£Ù ÙÙ
ÙÙÙØ§ Ø£Ù ÙØµÙع ÙØ§Ø¦Ùا Ù
ØªÙØ±Ø±Ùا ÙØ§Ùذ٠ÙÙÙÙ
Ø¨Ø¥ÙØ´Ø§Ø¡ ØªØªØ§Ø¨Ø¹ÙØ§ ØºÙØ± Ù
ÙØªÙÙ Ù
Ù Ø§ÙØ£Ø±ÙاÙ
Ø§ÙØ¹Ø´ÙØ§Ø¦ÙØ©. ÙÙÙ
ÙÙ ÙÙØ°Ø§ Ø£Ù ÙÙÙÙ Ù
ÙÙØ¯Ø£ Ø£ÙØ¶Ùا.
ÙØ§ ÙÙØ¬Ø¯ Ø£Ù ØØ¯Ùد ÙÙØ¯Ø§ÙØ© next ØÙØ« ÙÙ
ÙÙÙØ§ أ٠تÙÙÙ
بإرجاع اÙÙ
Ø²ÙØ¯ ÙØ§ÙÙ
Ø²ÙØ¯ Ù
٠اÙÙÙÙ
ÙÙØ°Ø§ Ø·Ø¨ÙØ¹Ù.
Ø¥Ù Ø§ÙØªÙرار Ù
٠اÙÙÙØ¹ for..of عÙÙ Ù
ØªÙØ±Ø± ÙÙØ°Ø§ سÙÙÙÙ Ø¨Ø§ÙØ·Ø¨Ø¹ ØºÙØ± Ù
ÙØªÙÙ. ÙÙÙÙ ÙÙ
ÙÙÙØ§ دائÙ
ا Ø¥ÙÙØ§Ù٠باستخداÙ
break.
اÙÙØµÙص ÙÙ ØªÙØ±Ø±Ø§Øª
إ٠اÙÙØµÙص (strings) ÙØ§Ù٠صÙÙÙØ§Øª (arrays) ÙÙ Ù ØªÙØ±Ø±Ø© Ø¨Ø§ÙØ·Ø¨Ùعة.
باÙÙØ³Ø¨Ø© Ø¥Ù٠اÙÙØµØ ÙØ¥Ù Ø§ÙØªÙرارات Ù
Ù ÙÙØ¹ for..of ستÙÙÙ
Ø¨Ø§ÙØªÙرار عÙÙ ØØ±Ù٠اÙÙØµ:
for (let char of "test") {
// ÙØªÙ
Ø§Ø³ØªØ¯Ø¹Ø¤ÙØ§ 4 Ù
Ø±Ø§ØªØ Ù
رة ÙÙÙ ØØ±Ù
alert(char); // t, then e, then s, then t
}
ÙØªØ¹Ù Ù Ø£ÙØ¶Ø§ بشÙ٠صØÙØ Ù Ø¹ Ø§ÙØ£Ø´ÙاÙ!
let str = "ð³ð";
for (let char of str) {
alert(char); // ð³, and then ð
}
استدعاء اÙÙ ØªÙØ±Ø± Ø¨ÙØ¶ÙØ
For deeper understanding, letâs see how to use an iterator explicitly.
سÙÙÙÙ
Ø¨Ø§ÙØªÙرار عÙÙ ÙØµ Ù
Ø«ÙÙ
ا تعÙ
Ù 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. عÙ٠سبÙ٠اÙÙ
Ø«Ø§ÙØ ÙÙ
ÙÙÙØ§ ÙØµÙ عÙ
ÙÙØ© Ø§ÙØªÙرار: ÙÙØ±Ø± ÙÙÙÙÙØ§ Ø«Ù
ÙÙÙ Ø«Ù
ÙÙØ¹Ù Ø´ÙØ¦Ùا آخر Ø«Ù
ÙØ³ØªØ£ÙÙ Ø§ÙØªÙرار.
اÙÙ ØªÙØ±Ø±Ø§Øª ÙØ£Ø´Ø¨Ø§Ù اÙ٠صÙÙÙØ§Øª (array-likes)
Two official terms look similar, but are very different. Please make sure you understand them well to avoid the confusion.
- اÙÙ
ØªÙØ±Ø±Ø§Øª ÙÙ ÙØ§Ø¦Ùات ØªØ³ØªØ¯Ø¹Ù Ø§ÙØ¯Ø§ÙØ©
Symbol.iteratorØ Ù٠ا Ø£ÙØ¶ØÙا سابÙÙØ§. - أشبا٠اÙÙ
صÙÙÙØ§Øª ÙÙ ÙØ§Ø¦Ùات Ø£ÙØ¶Ùا ÙÙÙÙÙØ§ ØªØØªÙ٠عÙÙ
indexÙlengthØ ÙØ¨Ø§ÙتاÙÙ ÙÙ٠تشب٠اÙ٠صÙÙÙØ©.
When we use JavaScript for practical tasks in a browser or any other environment, we may meet objects that are iterables or array-likes, or both.
عÙ٠سبÙ٠اÙÙ
Ø«Ø§ÙØ ستجد أ٠اÙÙØµÙص (strings) عبارة ع٠Ù
ØªÙØ±Ø± (ØÙØ« ÙÙ
Ù٠استخداÙ
for..of Ù
Ø¹ÙØ§) ÙÙØ°ÙÙ Ù٠شبÙÙØ© باÙÙ
صÙÙÙÙ (ÙØ£ÙÙØ§ ØªØØªÙ٠عÙÙ length Ù indexes).
ÙÙÙ٠اÙÙ ØªÙØ±Ø± ÙÙ ÙÙ Ø£Ù ÙØ§ ÙÙÙ٠شبÙÙÙØ§ باÙ٠صÙÙÙÙ. ÙØ§ÙØ¹ÙØ³ صØÙØ.
عÙ٠سبÙ٠اÙÙ
Ø«Ø§ÙØ ÙØ¥Ù اÙÙØ§Ø¦Ù range Ø§ÙØ°Ù استخدÙ
ÙØ§Ù سابÙÙØ§ ÙÙ Ù
ØªÙØ±Ø± Ø ÙÙÙÙÙ ÙÙØ³ شبÙÙÙØ§ باÙÙ
صÙÙÙÙ ÙØ£ÙÙØ§ ÙØ§ ØªØØªÙ٠عÙÙ indexes Ø£Ù length.
ÙÙÙØ¬Ø¯ Ø£ÙØ¶Ùا اÙÙØ§Ø¦Ù Ø§ÙØ°Ù Ù٠شبÙ٠باÙ٠صÙÙÙØ© ÙÙÙÙÙ ÙÙØ³ Ù ØªÙØ±Ø±Ùا:
let arrayLike = { // ØªØØªÙ٠عÙÙ indexes & length Ø¥Ø°ÙØ§ ÙÙ٠شبÙÙØ© باÙÙ
صÙÙÙØ© ÙÙÙÙÙØ§ ÙÙØ³Øª Ù
ØªÙØ±Ø±Ùا
0: "Hello",
1: "World",
length: 2
};
// خطأ (no Symbol.iterator)
for (let item of arrayLike) {}
عادة Ù
اتÙÙ٠اÙÙ
ØªÙØ±Ø±Ø§Øª ÙØ£Ø´Ø¨Ø§Ù اÙÙ
صÙÙÙØ§Øª ÙÙØ³Øª Ù
صÙÙÙØ©Ø ØÙØ« ÙØ§ ÙØØªÙÙ٠عÙÙ Ø§ÙØ¯Ùا٠push & pop ÙÙÙØ°Ø§. ÙÙØ°Ø§ ØºÙØ± Ù
ÙØ§Ø¦Ù
إذا ÙÙØ§ ÙØ±Ùد Ø£Ù ÙØªØ¹Ø§Ù
Ù Ù
ع ÙØ°Ø§ اÙÙØ§Ø¦Ù ÙÙ
ا ÙØªØ¹Ø§Ù
Ù Ù
ع اÙÙ
صÙÙÙØ©. Ù
Ø«ÙÙØ§: ÙØ±Ùد Ø£Ù ÙØªØ¹Ø§Ù
Ù Ù
ع اÙÙØ§Ø¦Ù range باستخداÙ
Ø¯ÙØ§Ù اÙÙ
صÙÙÙÙ. ÙÙÙ ÙÙ
ÙÙÙØ§ ÙØ¹Ù ذÙÙ Ø
Array.from
ØªÙØ¬Ø¯ Ø¯Ø§ÙØ© ٠عرÙÙØ© Array.from ÙØ§ÙØªÙ ØªØ³ØªÙØ¨Ù Ù ØªÙØ±Ø±Ùا أ٠شبÙÙÙØ§ باÙ٠صÙÙÙÙ ÙØªÙÙÙ Ø¨Ø¥ÙØ´Ø§Ø¡ ٠صÙÙÙØ© ØÙÙÙÙØ© Ù Ù ÙØ°Ù اÙÙÙÙ Ø©. ÙØ¨Ø§ÙتاÙÙ ÙÙ ÙÙÙØ§ Ø§Ø³ØªØ®Ø¯Ø§Ù Ø¯ÙØ§Ù اÙ٠صÙÙÙØ© عÙÙÙ.
عÙ٠سبÙ٠اÙ٠ثاÙ:
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])
اÙÙ
ØªØºÙØ± Ø§ÙØ«Ø§ÙÙ Ø§ÙØ¥ÙØªØ±Ø§Ø¶Ù Ø§ÙØ°Ù ØªØ³ØªÙØ¨ÙÙ Ø§ÙØ¯Ø§ÙØ© Array.from mapFn ÙÙ
Ù٠أ٠ÙÙÙÙ Ø¯Ø§ÙØ© تعÙ
٠عÙÙ ÙÙ Ø¹ÙØµØ± ÙØ¨Ù Ø¥Ø¶Ø§ÙØªÙ ÙÙÙ
صÙÙÙØ© Ø§ÙØ¬Ø¯ÙØ¯Ø©Ø ÙØ§ÙÙ
ØªØºÙØ± thisArg ÙØªÙØ ÙÙØ§ Ø¨Ø£Ù ÙØØ¯Ø¯ ÙÙÙ
Ø© this ÙÙØ¹Ùصر.
عÙ٠سبÙ٠اÙ٠ثاÙ:
// عÙÙ ÙØ±Ø¶ أ٠اÙÙØ§Ø¦Ù range Ù
Ø£Ø®ÙØ° Ù
٠اÙÙ
Ø«Ø§Ù Ø§ÙØ³Ø§Ø¨Ù
// ØªØ±Ø¨ÙØ¹ Ù٠رÙÙ
let arr = Array.from(range, (num) => num * num);
alert(arr); // 1,4,9,16,25
ÙÙ ÙØ°Ø§ اÙÙ
ثا٠استخدÙ
ÙØ§ Array.from ÙØªÙÙÙ
بتØÙÙ٠اÙÙØµ Ø¥ÙÙ Ù
صÙÙÙØ© Ù
Ù Ø§ÙØØ±ÙÙ:
let str = "ð³ð";
// splits str into array of characters
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 internally does the same loop
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 تدع٠Ù
ØªÙØ±Ø±Ø§Øª.
- Technically, iterables must implement the method named
Symbol.iterator.- The result of
obj[Symbol.iterator]()is called an iterator. It handles further iteration process. - An iterator must have the method named
next()that returns an object{done: Boolean, value: any}, heredone:truedenotes the end of the iteration process, otherwise thevalueis the next value.
- The result of
- The
Symbol.iteratormethod is called automatically byfor..of, but we also can do it directly. - Built-in iterables like strings or arrays, also implement
Symbol.iterator. - String iterator knows about surrogate pairs.
إ٠اÙÙØ§Ø¦Ùات Ø§ÙØªÙ ØªØØªÙ٠عÙÙ indexes & length تسÙ
٠أشبا٠اÙÙ
صÙÙÙØ§Øª. ÙØ°Ù اÙÙØ§Ø¦Ùات ÙÙ
ÙÙÙØ§ Ø§Ù ØªØØªÙÙ Ø£ÙØ¶Ùا عÙ٠خصائص ÙØ¯ÙاÙ٠أخر٠ÙÙÙÙÙØ§ ÙØ§ ØªØØªÙ٠عÙÙ Ø¯ÙØ§Ù اÙÙ
صÙÙÙØ§Øª Ù
ث٠push & pop.
إذا ÙØ¸Ø±Ùا Ø¥Ù٠اÙ٠صدر â Ø³Ùجد Ø£Ù Ø£ØºÙØ¨ Ø§ÙØ¯Ùا٠اÙÙ ÙØ¬Ùد٠باÙÙØ¹Ù ØªÙØªØ±Ø¶ أ٠أÙÙØ§ تع٠٠٠ع Ù ØªÙØ±Ø±Ø§Øª أ٠أشبا٠٠صÙÙÙØ§Øª بدÙÙØ§ ٠٠٠صÙÙÙØ§ØªØ ÙØ£Ù ÙØ°Ø§ Ø£ÙØ«Ø± Ø§Ø®ØªØµØ§Ø±ÙØ§.
Ø¥Ù Ø§ÙØ¯Ø§ÙØ© Array.from(obj[, mapFn, thisArg]) ØªØµÙØ¹ Ù
صÙÙÙØ© ØÙÙÙÙØ© Ù
Ù Ù
ØªÙØ±Ø± أ٠شبÙÙ٠باÙÙ
صÙÙÙØ©Ø ÙØ¨Ø§ÙتاÙÙ ÙÙ
ÙÙÙØ§ استخداÙ
Ø¯ÙØ§Ù اÙÙ
صÙÙÙØ§Øª عÙÙÙÙ
. ØÙØ« أ٠اÙÙ
ØªØºÙØ±Ø§Øª mapFn & thisArg ØªØªÙØ ÙÙØ§ Ø£Ù ÙÙÙØ° Ø¯Ø§ÙØ© عÙÙ ÙÙ Ø¹ÙØµØ± ÙØ¨Ù Ø¥Ø¶Ø§ÙØªÙ ÙÙÙ
صÙÙÙØ©.
Array.from(obj[, mapFn, thisArg]) makes a real Array from an iterable or array-like obj, and we can then use array methods on it. The optional arguments mapFn and thisArg allow us to apply a function to each item.

Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)