yield*‎ في JavaScript

من موسوعة حسوب
مراجعة 15:43، 28 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

التعبير yield*‎ يُستخدَم لتفويض التنفيذ إلى دالة مولِّدة أخرى أو كائن iterable.

البنية العامة

 yield* [[expression]];

expression

التعبير الذي سيُعيد كائن iterable.

الوصف

سيؤدي التعبير yield*‎ إلى المرور على عناصر الكائن ويعطي كل قيمة أعادها هذا الكائن.

قيمة التعبير yield*‎ نفسه هي القيمة المُعادة من الكائن iterable عند إغلاقه (أي عندما تكون قيمة الخاصية done هي true).

أمثلة

تفويض التنفيذ إلى دالة مولِّدة أخرى

لاحظ أنَّ القيمة التي تعطيها (yield) الدالة g1()‎ ستُعاد عند استدعاء الدالة next()‎ مثل القيم التي تعطيها الدالة g2()‎:

function* g1() {
  yield 2;
  yield 3;
  yield 4;
}

function* g2() {
  yield 1;
  yield* g1();
  yield 5;
}

var iterator = g2();

console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: 4, done: false}
console.log(iterator.next()); // {value: 5, done: false}
console.log(iterator.next()); // {value: undefined, done: true}

كائنات itreable الأخرى

يمكن استخدام التعبير yield*‎ لإعطاء قيمة لكائنات iterable، مثل المصفوفات والسلاسل النصية وكائن arguments (الوسائط المُمرَّرة إلى الدالة):

function* g3() {
  yield* [1, 2];
  yield* '34';
  yield* Array.from(arguments);
}

var iterator = g3(5, 6);

console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: "3", done: false}
console.log(iterator.next()); // {value: "4", done: false}
console.log(iterator.next()); // {value: 5, done: false}
console.log(iterator.next()); // {value: 6, done: false}
console.log(iterator.next()); // {value: undefined, done: true}

قيمة التعبير yield*‎ نفسه

لاحظ أنَّ yield*‎ هو تعبير (expression) وليس تعبير برمجي (statement)، لذا ستكون له قيمة:

function* g4() {
  yield* [1, 2, 3];
  return 'foo';
}

var result;

function* g5() {
  result = yield* g4();
}

var iterator = g5();

console.log(iterator.next()); // {value: 1, done: false}
console.log(iterator.next()); // {value: 2, done: false}
console.log(iterator.next()); // {value: 3, done: false}
console.log(iterator.next()); // {value: undefined, done: true}, 

// g4() returned {value: 'foo', done: true} 
console.log(result); // "foo"

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم غير مدعومة نعم 10

على النقيض من متصفح IE، يدعم متصفح Edge هذه الميزة.

مصادر ومواصفات