اشتراک در خبرنامه‌ دارکوب وب

با عضویت در خبرنامه‌ی دارکوب وب مقالات و آموزش‌ها هر هفته به ایمیل شما ارسال می‌شود.

آشنایی با استاندارد JavaScript ECMA6 قسمت چهارم

فانکشن Generators :

فانکشنی است که یک iterator تولید می کنه و همین طور در generator باید از کلمه کلیدی به نام yield استفاده کنید .
برای ساخت یک generator function از علامت * استفاده می کنیم سپس از yield برای فرستادن چندین values استفاده می کنیم.


let numbers = function*() {

yield 1;
yield 2;
yield 3;

};
let sum = 0;
let iterator = numbers();
let next = iterator.next();
while (!next.done) {
sum += next.value;
next = iterator.next();
}

alert(sum);

چیزی که yield را قابل توجه می کنه اینه که هر دفعه از yield استفاده میشه فانکشن مقدار جدید می سازه ، می تونیم مقادیر مختلفی را با yield برگردونیم چون آبجکت جنیریتور مثل یک کار خونه برای iterator عمل می کنه ، ابجکت iterator با دستور next به yield ها دسترسی پیدا می کنه .
وقتی اولین next اجرا می شه به اولین yield اشاره داریم ، درون حلقه next به yield بعدی اشاره می کنه و به همین ترتیب
من حتی می تونم برای generator پارامتر ورودی تعریف کنیم :

let numbers = function*(start, end) {

for (let i = start; i <= end; i++) {
yield i;
}
};
let sum = 0;
let iterator = numbers(1,5);
let next = iterator.next();
while (!next.done) {
sum += next.value;
next = iterator.next();
}

alert(sum);

حالا بیاید مثال مبحث قبلی را با استفاده از generator بنویسیم :

class Dustam {
 constructor() {
 this.dustha = [];
 }

 ezafeKardaneDust(...names) {
 this.dustha = this.dustha.concat(names);
 }

 *[Symbol.iterator]() {
 for(let e of this.dustha){
 console.log(e);
 yield e;
 }
 }
}


let shomarande = 0;
let dustam = new Dustam();

dustam.ezafeKardaneDust("Hooman", "Ahkan", "Maryam", "Negar");
for (let dustaneMan of dustam) {
 shomarande += 1;
}

alert(shomarande);

می بینید ، به همین راحتی ، حالا تعداد خط کدهای کمتری هم نوشتیم .
اگر بخواهم نتیجه را فیلتر کنم چطور؟ مثلا دوستانی که حرف اول اسم آنها با A شروع می شود؟

class Dustam {
constructor() {
this.dustha = [];
}

ezafeKardaneDust(...names) {
this.dustha = this.dustha.concat(names);
}

*[Symbol.iterator]() {
for (let e of this.dustha) {
console.log(e);
yield e;
}
}
}
let filter = function *(items, hastNist) {
for (let item of items) {
if (hastNist(item)) {
yield item;
}
}
};

let shomarande = 0;
let dustam = new Dustam();

dustam.ezafeKardaneDust("Hooman", "Ahkan", "Amirreza", "Negar");
for (let dustaneMan of filter(dustam, e =>e[0] == "A")) {
shomarande += 1;
}

alert(shomarande);

Comprehensions :

اگر با python آشنایی داشته باشید با این مفهوم هم آشنا هستید ، بیاد در مثال ببینیم :

let numbers = [];
for(let n of[1,2,3]){
numbers.push(n*n);
}
alert(numbers);

کد بالا بسیار آشناست و نتیجه آن ۱,۴,۹ می شود ، حالا comprehension را ببینید:

var numbers = [for (n of [1, 2, 3])n * n];
alert(numbers);

نتیجه ۱,۴,۹ خواهد بود.
بیاید در مثال دوستان از comprehension استفاده کنیم :

class Dustam {
constructor() {
this.dustha = [];
}

ezafeKardaneDust(...names) {
this.dustha = this.dustha.concat(names);
}

*[Symbol.iterator]() {
for (let e of this.dustha) {
console.log(e);
yield e;
}
}
}
let filter = function *(items, hastNist) {
yield*(for (item of items) if (hastNist(item))item);
};

let shomarande = 0;
let dustam = new Dustam();

dustam.ezafeKardaneDust("Hooman", "Ahkan", "Amirreza", "Negar");
for (let dustaneMan of filter(dustam, e =>e[0] == "A")) {
shomarande += 1;
}

alert(shomarande);

آبجکت ها در ECMA6 :

Number :

به کد و توضیحات دقت کنید :

var octal = 0o71; // adade Octal
var bin = 0b1101; // adade binery
var octNum = Number("0o71"); // reshte be octal
var binNum = Number("0b101"); // reshte be binery

در کد بالا می بینید که برای تعریف یک عدد اکتال از ۰ وo و برای عدد باینری از ۰ و b استفاده می کنیم .

عدد اینتیجر را باید به این شکل تشخیص دهید :

alert("integer ast ? "+Number.isInteger(1));
alert("integer ast ? "+Number.isInteger(1.0));
alert("integer ast ? "+Number.isInteger(1.5));

همان طور که خواهید دید ۱٫۰ اینتیجر است اما ۱٫۵ نیست.
وقتی از isNaN و isFinite استفاده می کنید مراقب باشید ،آنها در هنگام استفاده شدن با Number جواب های متفاوتی به شما نشان می دهند.

alert(isFinite("1"));
alert(Number.isFinite("1"));
alert("isNaN "+isNaN("NaN"));

درباره نویسنده

پوریا

سلام ، من پوریا هستم با جاوا آشنایی دارم به هوش مصنوعی و امنیت علاقه مندم و امید وارم آموزش هایی که در وب سایت قرار می دم برای شما مفید باشه ، موفق باشید {^}

نظر دهید

سوالات، انتقادات و پیشنهادات خود را در مورد این مطلب برای ما بفرستید. :-)