همانطور که پیشتر در
این مطلب نیز توضیح داده شد symbol یک primitive data type مانند number و string است. حین کار کردن با سمبلها باید این نکات را در نظر بگیرید:
- منحصربفرد و immutable (غیرقابل تغییر) هستند.
- همانند رشتهها میتوان از آنها به عنوان کلیدی برای پراپرتیها یک شیء استفاده کرد.
بنابراین از سمبلها بیشتر جهت توکنهای منحصر به فرد برای استفاده و به عنوان کلید در پراپرتیهای اشیاء استفاده خواهد شد. در
اینجا میتوانید لیستی از سمبلهای رایج را مشاهده کنید.
Iterators and Generators
یک شیء زمانی قابلیت پیمایش را خواهد داشت که یک پیادهسازی از Symbol.iterator را داشته باشد:
var myIterable = {}
myIterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
در اینحالت میتوان شیء myIterable را توسط حلقهی for..of پیمایش کرد:
for (let item of myIterable) {
console.log(item);
}
در واقع کار حلقهی for..of حرکت درون یک قابل پیمایش (iterable) است و در هر بار اجرای حلقه پراپرتی Symbol.iterator شیء را فراخوانی خواهد کرد.
تفاوت حلقهی for..of با حلقهی for..in
هر دوی این حلقهها یک لیست را پیمایش میکنند. با این تفاوت که حلقهی for..in کلید هر آیتم را بر میگرداند اما for..of مقدار هر آیتم را بر میگرداند:
let list = [4, 5, 6];
for (let i in list) {
console.log(i); // "0", "1", "2",
}
for (let i of list) {
console.log(i); // "4", "5", "6"
نکتهی دیگر این است که for..in برای هر شیءی قابل استفاده است یعنی از آن جهت پیمایش پراپرتیهای یک شیء استفاده خواهد شد. اما for..of برای اشیایی که قابلیت پیمایش را داشته باشند استفاده خواهد شد؛ همانند Map و Set که پراپرتی Symbol.iterator را پیادهسازی کردهاند.
به عنوان مثال کد زیر را در نظر بگیرید:
let numbers = [1, 2, 3];
for (let num of numbers) {
console.log(num);
} اگر
target را به ES5 و یا ES6 تنظیم کرده باشید، کد تولید شدهی یک حلقهی for را به اینصورت برایتان تولید خواهد کرد:
var numbers = [1, 2, 3];
for (var _i = 0, numbers_1 = numbers; _i < numbers_1.length; _i++) {
var num = numbers_1[_i];
console.log(num);
}
//# sourceMappingURL=app.js.map