حاولنا القيام بشيء مثير للاهتمام وغير عادي بالنسبة لك. آمل حقاً أن ننجح. لم نكن نريد أن نتركك دون إجابة ولا يوجد سبب لذلك. هيا بنا
بادئ ذي بدء ، أود أن أذكركم كيف أجريت المسابقة ، كان هناك 4 جولات من 15 سؤالًا حول JS ، وجولة واحدة خارج المنافسة من 15 سؤالًا حول React ونهائيًا يتكون من 10 أسئلة.

تحت خفض - تحليل مهام أول 4 جولات.
هذا هو الجزء الثاني من تحليلنا.
الرد على الأسئلة هنا
كيف فعلنا كل هذا؟ قررنا أننا بحاجة إلى إنشاء حوالي 80-90 سؤالًا بحيث يكون هناك مخزون يمكن اختياره منه. بعد ذلك ، قسمنا كل شيء إلى مواضيع:
- أحداث المتصفح
- واجهات برمجة التطبيقات المختلفة (Array ، Set ، identProperty ، إلخ) ،
- الاهتمام
- العمل مع أرقام كسور
- الرفع
- حلقة الحدث
- نوع التحويل
- typeof
- منطقية (مع منطقية AND و OR)
بعد ذلك ، تم توزيع الأسئلة على 4 جولات. لقد حاولنا جعل جميع الجولات متشابهة في التعقيد ، ولهذا قمنا بعدة زيارات واجتازت هذه الاختبارات ونحدد المكان الذي تكون فيه الأسئلة أسهل ، حيث يكون الأمر أكثر صعوبة واستبدال الأسئلة المعلقة بأسئلة أكثر ملاءمة. وقد فعلنا نفس العدد من الأسئلة حول موضوع معين في كل جولة. نتيجة لذلك ، اتضح أنه في جولات مختلفة كانت هناك أسئلة متشابهة ، لكن ليس الأسئلة نفسها.
لهذا السبب ، لا يبدو الأمر مناسبًا للغاية للتجول في الجولات لأنه سيكون هناك الكثير من التفسيرات المكررة ، أقترح النظر إليها حسب الموضوع. لنبدأ مع أبسط.
أسئلة للاهتمام:
ما سيتم عرضه في وحدة التحكم؟
console.log(0,1 + 0,2); a) 0.30000000000000004 b) 0.3 c) 2 d) 0 1 2
الإجابة + تحليلد) 0 1 2
يقف هنا بين الأرقام ، وليس .
إذا قمت بتنسيق السؤال مثل هذا:
console.log(0, 1 + 0, 2);
كل شيء سوف يصبح واضحا
ما سيتم عرضه في وحدة التحكم؟
(() => { 'use strict'; a = null + undefined; console.log(a); })(); a) 0 b) NaN c) null d)
الإجابة + تحليلد) خطأ
لم يتم إنشاء a كمتغير (ليس إعلان متغير) ، وهنا يوجد تعبير ضمني ضمني this.a
وهو في كثير من الأحيان قد لا يكون ما تتوقعه ، لأن سيتم إنشاء window.a
متغير عالمي في وضع صارم ، وهذا محظور.
ما سيتم عرضه في وحدة التحكم؟
let foo = function bar() { return 123; }; console.log( typeof bar() ); a) 'function' b) 'number' c) 'undefined' d)
الإجابة + تحليلد) خطأ
هذا تعبير وظيفي (تعبير) - اسم الوظيفة في هذه الحالة محلي للوظيفة. للاتصال وظيفة ، تحتاج إلى استدعاء foo
، وليس bar
. إذا كان إعلانًا ، فسيكون الجواب هو number
.
أسئلة حول العمل باستخدام الأرقام الكسرية:
ما سيتم عرضه في وحدة التحكم؟
console.log(0.1 ** 2); a) 0.2 b) 0.01 c) 0.010000000000000002 d) NaN
ما سيتم عرضه في وحدة التحكم؟
console.log(0.1 + 0.2); a) 0.30000000000000004 b) 0.3 c) 2 d) NaN
الإجابة + تحليلأ) 0.30000000000000004
**
- هذا هو تناظرية Math.pow تربيع 0.1
- يجب أن تتحول 0.01
، ولكن في JS (كما هو الحال في العديد من اللغات الأخرى) هناك مشكلة معروفة مع دقة العمليات عند العمل مع أرقام الفاصلة العائمة . سيكون 0.010000000000000002
هذا يرجع إلى حقيقة أنه في النظام الثنائي يتم الحصول على كسر لانهائي ، ل بالضبط 64 بت يتم تخصيصها دائمًا لرقم في JS - جميع الأرقام هي دائمًا نقطة عائمة مزدوجة الدقة. يحدث الشيء نفسه عند إضافته.
ننتقل إلى الأسئلة أكثر تعقيدا قليلا.
الأحداث في المتصفح:
يوجد عنصر حدث على العنصر ، ما هي القيم الموجودة داخل هذا المعالج وستظل دائمًا كما هي؟
elem.onclick = function(event) { } a) event.target event.currentTarget b) event.target this c) event.currentTarget this d)
الإجابة + تحليلج) event.currentTarget وهذا
this
- سوف يشير دائما إلى عنصر
currentTarget
- العنصر الذي يخيم عليه الحدث
target
- العنصر الذي وقع عليه الحدث
ما سوف يخرج هذا الرمز من خلال النقر على div؟
div.onclick = function() { console.log(1) }; div.onclick = function() { console.log(2) }; div.addEventListener('click', function() { console.log(3) }); a) 1 b) 1 3 c) 2 3 d) 3
الإجابة + تحليلج) 2 3
ستقوم onclick بإضافة معالج console.log(1)
، ولكن في السطر التالي سنطحنها بوظيفة جديدة ويبقى console.log(2)
. onclick
هي خاصية DOM ؛ إنها دومًا واحدة
ستعمل الأحداث بالترتيب الذي علقت به ، وسيتم عرض أول 2 ثم 3.
إذا فعلنا addEventListener
عدة مرات ، addEventListener
كل منهم ، لأن إضافة معالجات الأحداث إلى قائمة الانتظار.
قسم الأسئلة حول واجهات برمجة التطبيقات المختلفة
define الممتلكات:
ما سوف يخرج هذا الرمز؟
(() => { const obj = { key: 1 }; Object.defineProperty(obj, 'key', { enumerable: false, configurable: false, writable: false, value: 2 }); console.log(obj.key); obj.key = 3; console.log(obj.key); })(); a) 1, 2 b) 2, 2 c) 2, 3 d)
ما سوف يخرج هذا الرمز؟
(() => { 'use strict'; const obj = { key: 1 }; Object.defineProperty(obj, 'key', { enumerable: false, configurable: false, writable: false, value: 2 }); console.log(obj.key); obj.key = 3; console.log(obj.key); })(); a) 1, 2 b) 2, 2 c) 2, 3 d) 2,
ما سوف يخرج هذا الرمز؟
(() => { const obj = { key: 1 }; Object.defineProperty(obj, 'key', { enumerable: false, configurable: false, writable: true, value: 2 }); console.log(obj.key); obj.key = 3; console.log(obj.key); })(); a) 1, 2 b) 2, 2 c) 2, 3 d)
الإجابة + تحليلج) 2 ، 3
في جميع الأسئلة أعلاه ، يتم defineProperty
من معرفة طريقة defineProperty
وبشكل أكثر تحديدًا ، الإعدادات writable
. إذا تم تعيينه على " false
يُحظر تغيير قيم المفتاح الذي تم تمريره كمعلمة ثانية defineProperty
. الفرق الوحيد هو أنه بدون وضع صارم - use strict
المحرك سوف يدعي أن كل شيء على ما يرام ، لكنه لن يغير القيمة ، وسيكون هناك خطأ في الوضع الصارم.
الزيادة:
ما سوف يخرج هذا الرمز؟
let x = 5; console.log(x++); a) 5 b) 6 c) '5++' d)
ما سوف يخرج هذا الرمز؟
const a = 5; console.log(a++); a) 5 b) 6 c) '5++' d)
الجوابد) خطأ
عند استخدام نموذج postfix للتجريم ، يتم إرجاع القيمة قبل الزيادة.
ومع البادئة بعد ، أي console.log(++5)
ستطبع 6
لا يمكن الكتابة على const
؛ الرقم بدائي ، عندما تتم زيادته ، سيتم استبدال المتغير بالقيمة الجديدة وسيكون هناك خطأ.
تعيين:
ما سوف يخرج هذا الرمز؟
const a = [...new Set([1, 1, 2, , 3, , 4, 5, 5])]; console.log(a); a) [1, 1, 2, , 3, , 4, 5, 5] b) [1, 2, undefined, 3, 4, 5] c) [1, 1, 2, undefined, 3, undefined, 4, 5, 5] d)
الجوابب) [1 ، 2 ، غير محدد ، 3 ، 4 ، 5]
ما سوف يخرج هذا الرمز؟
let set = new Set([10, '10', new Number(10), 1e1, 0xA]); console.log(set.size); a) 5 b) 3 c) 2 d) 1
ما سوف يخرج هذا الرمز؟
let obj = {}; let set = new Set([obj, obj, {}, {}, {...{}}, {...obj}]); console.log(set.size); a) 6 b) 5 c) 2 d) 1
الجوابب) 5
Set
عبارة عن مجموعة ؛ بحكم التعريف لا يمكن أن توجد فيها قيم متطابقة. والسؤال هو كيف تتم مقارنة هذه القيم. تتم مقارنة الأوليات بالقيمة ، والكائنات حسب المرجع.
في حد ذاته لا يستشهد بأنواع البيانات ويمكن تخزين قيم أي نوع 1e1
و 0xA
- سيتم تحويله إلى نظام عشري والحصول على 10
.
والكائنات الجديدة ليست دائمًا متساوية: console.log({} == {})
سيعود false
منذ ذلك الحين سيتم إنشاء الكائنات بطريقة جديدة في أماكن مختلفة من الذاكرة ولن تكون روابطها متساوية.
ما سوف يخرج هذا الرمز؟
console.log(Infinity / Infinity); a) NaN b) 1 c) Error d) Infinity
الجوابأ) ن
تقسيم اللانهاية عن طريق اللانهاية وطرح اللانهاية من اللانهاية أمر مستحيل ل من وجهة نظر رياضية ، يتم الحصول على عدم اليقين ، وسوف يحدث نفس الشيء عندما Infinity
ضرب Infinity
و 0
أخطاء لا تسبب عمليات رياضية - سيكون هناك NaN
أسئلة حول السبريد:
ما سوف يخرج هذا الرمز؟
const a = { ...{ a: 1, b: 2, c: 3 }, ...{ a: 2, c: 4, d: 8 } }; console.log(a); a) { a: 2, b: 2, c: 4, d: 8 } c) { a: 1, b: 2, c: 3, d: 8 } c) { a: 1, b: 2, c: 3, a: 2, c: 4, d: 8 } d)
الجوابأ) {أ: 2 ، ب: 2 ، ج: 4 ، د: 8}
ما سوف يخرج هذا الرمز؟
const a = [...[1, 2], ...[[3, 4]], ...[5, 6]]; console.log(a); a) [1, 2, 3, 4, 5, 6] b) [1, 2, [3, 4], 5, 6] c) [[1, 2], [[3, 4]], 5, 6] e)
الإجابة + تحليلب) [1 ، 2 ، [3 ، 4] ، 5 ، 6]
يخدم مشغل Spread
تحليل كائن أو صفيف إلى أجزاء. يستغرق القيم من الكيان بعد ...
وينسخها إلى الكيان الذي تم إنشاؤه. تجدر الإشارة إلى أنه بالنسبة للصفيف والكائن يفتح إلى مستوى واحد ، أي ...[[1]]
سيعود صفيفًا به عنصر واحد ، وليس العنصر نفسه. لا يمكن أن توجد قيم مكررة في الكائنات ، وبالتالي ، فإن القيم التي تم الكشف عنها بعد سيتم استبدالها بواسطة تلك التي تم الكشف عنها مسبقًا. يمكن استخدام هذا لتحديد الإعدادات الافتراضية.
const fn = (actualProps) => ({ ...defaultProps, ...actualProps })
سيتم تجاوز جميع القيم الافتراضية بالقيم التي تم تمريرها ، إن وجدت.
ما سوف يخرج هذا الرمز؟
console.log(parseInt(' -10,3 ')); a) -10,3 b) -10 c) TypeError d) NaN
الإجابة + تحليلب) -10
وصف شامل مع MDN :
إذا واجهت وظيفة parseInt حرفًا ليس رقمًا في نظام الأرقام المحدد ، فإنها تتخطى هذا وجميع الأحرف اللاحقة (حتى لو كانت مناسبة) وتُرجع عددًا صحيحًا تم تحويله من جزء السلسلة التي تسبق هذا الحرف. parseInt يقطع الجزء الكسري من العدد. يتم السماح المسافات في بداية ونهاية السطر.
ما سوف يخرج هذا الرمز؟
const t = { a: 6, b: 7 }; const p = new Proxy(t, { get() { return 12; }, }); console.log(pa); pa = 18; console.log(pa); console.log(ta); a) b) 12 18 18 c) 12 18 6 d) 12 12 18 e) 6 18 6
الإجابة + تحليلد) 12 12 18
Proxy
يعترض كل المكالمات إلى الكائن. في هذه الحالة ، فإننا نستخدم أسلوب get
فقط ونرجع دائمًا 12
بغض النظر عن مجال الكائن الذي نصل إليه. في هذه الحالة ، لا نلمس مجموعة ، وعند الوصول إلى الوكيل ، سيتم استبدال القيمة في الكائن.
صفائف:
ما سوف يخرج هذا الرمز؟
let arr = []; arr[1] = 1; arr[5] = 10; console.log(arr.length); a) 1 b) 5 c) 6 d) 10
ما سوف يخرج هذا الرمز؟
let arr = new Array(3); console.log(arr[1]); a) undefined b) 1 c) 3 d)
الإجابة + تحليلأ) غير محدد
عندما ننشئ صفيفًا باستخدام وسيطة رقمية واحدة ، فهذا يعني طول الصفيف. يتم إنشاء مجموعة فارغة ، وجميع القيم undefined
. يحدث نفس الشيء إذا قمت بإنشاء الوصول إلى حقل صفيف غير موجود. تجدر الإشارة إلى أنه إذا قمت بتمرير رقم إلى Array
، فسيتم إرجاع صفيف بهذا العنصر ، على سبيل المثال Array('a')
ستعود ['a']
العمليات المنطقية &&
، ||
، ==
، إلخ:
ما سوف يخرج هذا الرمز؟
console.log([] && 'foo' && undefined && true && false); a) [] b) 'foo' c) undefined d) true
ما سوف يخرج هذا الرمز؟
console.log(0 || 1 && 2 || 3); a) 0 b) 1 c) 2 d) 3
ما سوف يخرج هذا الرمز؟
console.log(0 || '' || 2 || undefined || true || false); a) 0 b) false c) 2 d) true
ما سوف يخرج هذا الرمز؟
console.log(2 && '1' && null && undefined && true && false); a) 2 b) false c) undefined d) null
ما سوف يخرج هذا الرمز؟
console.log([] && {} || null && 100 || ''); a) true b) 100 c) '' d) {}
الإجابة + تحليلد) {}
صفيف فارغ []
true
كما هو كائن فارغ {}
.
السلسلة الفارغة ''
و null
و undefined
غير false
منطقية أو ||
- إرجاع المعامل الأيسر ، إذا كان ذلك صحيحًا ، وإلا يُرجع المعامل الأيمن.
المنطقية و &&
- تُرجع المعامل الأيسر ، إذا كانت خاطئة ، وإلا تُرجع المعامل الأيمن.
يمكن العثور على هذا في الكود أحيانًا ، قبل ظهور المعلمات الافتراضية ، غالبًا ما يكتبون هكذا - إذا لم تكن هناك معلمات في الوظيفة ، فسنأخذ المعلمات الافتراضية:
function f(userParams) { var params = userParams || defaultParams; }
الآن يتفاعل React غالبًا ما إذا كانت الحالة صحيحة ، ثم نقدم شيئًا:
{ isDivVisible && <div>bla-bla</div> }
مقارنة مجموعة:
ما سوف يخرج هذا الرمز؟
const arrayFoo = [1, 2, 3, 4]; const arrayBaz = [1, 2, 3, 4]; console.log(arrayFoo == arrayBaz && arrayFoo == arrayBaz); a) false b) true c) undefined d)
ما سوف يخرج هذا الرمز؟
console.log([null, 0, -0].map(x => 0 <= x)); a) [false, true, false] b) [false, true, true] c) [false, false, false] d) [true, true, true]
ما سوف يخرج هذا الرمز؟
const arrayFoo = [1, 2, 3, 4]; const arrayBaz = [1, 2, 3, 4]; console.log(arrayFoo >= arrayBaz && arrayFoo <= arrayBaz); a) true b) false c) undefined d)
ما سوف يخرج هذا الرمز؟
const foo = [1, 2, 3, 4]; const baz = '1,2,3,4'; console.log(foo >= baz && foo <= baz); a) false b) true c) undefined d)
الإجابة + تحليلب) صحيح
عندما ==
مقارنة حسب المرجع.
أثناء العملية >, >=, <, <=
يتم تحويل المعاملات إلى بدائل وتسمى طريقة arrayFoo
على arrayFoo
، والتي يجب أن تُرجع arrayFoo
القيمة البدائية ، لكنها تُرجع مرجعًا إلى نفس الصفيف. بعد ذلك ، يحدث تحويل إلى قيمة بدائية عن طريق استدعاء الأسلوب toString
، والذي بدوره سيعود تمثيل سلسلة الصفيف في شكل "1،2،3،4" سوف يقارن صفيفين معجميا ويعود true
ما سوف يخرج هذا الرمز؟
console.log(+0 == -0); console.log(+0 === -0); console.log(Object.is(+0, -0)); a) true, false, false b) true, true, false c) false, true, true d) false, false. false
الإجابة + تحليلب) صحيح ، صحيح ، خطأ
شرح شامل مع MDN :
سلوك هذا الأسلوب (الحديث عن Object.is
) ليس هو نفسه العامل ===
. المشغل ===
(وكذلك العامل ==
) يعتبر القيم الرقمية -0
و +0
متساوية ، والقيمة Number.NaN
لا تساوي نفسها.
أسئلة حول الرفع:
ما سوف يخرج هذا الرمز؟
console.log(str); const str = 'HeadHunter'; a) 'HeadHunter' b) undefined c)
ما سوف يخرج هذا الرمز؟
var arrayFunction = []; for (let i = 0; i <= 10; i++) { arrayFunction.push(() => i); } console.log(arrayFunction[3]()); a) 4 b) 0 c) 11 d) 3
ما سوف يخرج هذا الرمز؟
console.log(str); var str = 'HeadHunter'; a) 'HeadHunter' b) undefined c) null c)
ما سوف يخرج هذا الرمز؟
console.log(foo); var foo; foo = foo ? 1 : 0; console.log(foo); a) b) undefined 0 c) '' 1 d) 0 0
هل ستعمل وظيفة الاتصال؟
getCompanyName(); function getCompanyName() { return 'HeadHunter'; } a) b) , . c)
ما سوف يخرج هذا الرمز؟
var arrayFunction = []; for (var i = 0; i <= 10; i++) { arrayFunction.push(() => i); } console.log(arrayFunction[3]()); a) 4 b) 0 c) 11 d) 3
الإجابة + تحليلج) 11
إعلانات الوظائف المنبثقة ، ولكن لا التعبير.
var
للملوثات العضوية الثابتة ، ولكن حتى التهيئة غير undefined
.
let
و const
لا يطفو على السطح ولها نطاق في كتلة أي يقتصر على {}
.
لكي تعمل الحلقة بشكل صحيح مع var
تحتاج إلى استخدام إغلاق ، وسيتم حفظ القيمة فيه.
(كانت هذه مهمة كلاسيكية للمقابلات ، ولكن الآن سمحنا لها)
var arrayFunction = []; for (var i = 0; i <= 10; i++) { (function(i) { arrayFunction.push(() => i); })(i); } console.log(arrayFunction[3]());
ما سوف يخرج هذا الرمز؟
console.log(true + false); a) true b) false c) 1 d) 0
الإجابة + تحليلج) 1
لا يوجد أي من المشغلين عبارة عن سلسلة ، +
يؤدي إلى عدد. اتضح 1 + 0
ما سوف يخرج هذا الرمز؟
console.log([] - 100 + ![]); a) false b) '-100' c) -100 d) NaN
الإجابة + تحليلج) -100
يتم تحويل الصفيف إلى سلسلة ، وبعد ذلك ، بسبب -
نحن يلقي رقمًا ، يتحول -100
، ثم نلقي الصفيف على false
، وهذا هو 0
ما سوف يخرج هذا الرمز؟
console.log([[], []] + 1); a) 1 b) '1' c) ',1' d) NaN
الإجابة + تحليلج) "، 1"
toString
على الكائن ، في حين سيتم استدعاء toString
أيضًا على جميع عناصر المصفوفة. [].toString
السلسلة سلسلة فارغة. اتضح , + 1
- الجواب ,1
.
ما سوف يخرج هذا الرمز؟
console.log([] + 100 + 5); a) 105 b) '1005' c) 1005 d) NaN
الإجابة + تحليلب) "1005"
الصفيف قابل للاختزال إلى سلسلة ، ثم يحدث تسلسل بالفعل.
ما سوف يخرج هذا الرمز؟
console.log(1 + { a: 3 } + '2'); a) 6 b) '1[object Object]2' c) 3 d) NaN
الإجابة + تحليلب) "1 [كائن كائن] 2"
تحويل إلى سلسلة - إنه مجرد تسلسل.
ما سوف يخرج هذا الرمز؟
console.log(10.toString() + 10 + 0x1); a) '10101' b) 21 c) '10100x1' d)
الإجابة + تحليلد) خطأ
لعدد النقاط .
يعني بداية الجزء الكسري ، نتوقع رقماً هناك - سيكون هناك خطأ.
لجعل هذا المثال يعمل بشكل جيد ، تحتاج إلى كتابة 10..toString()
ما سوف يخرج هذا الرمز؟
console.log(5 + false - null + true); a) '0true' b) NaN c) 6 d)
الإجابة + تحليلج) 6
هنا يتم تقليل كل شيء إلى رقم ، اتضح 5 + 0 - 0 + 1
ما سوف يخرج هذا الرمز؟
console.log(true + NaN + false); a) true b) NaN c) false d) 1
الإجابة + تحليلب) NaN
نقوم بتقليل كل شيء إلى رقم ، عند إضافة أرقام باستخدام NaN
- نحصل على NaN
ما سوف يخرج هذا الرمز؟
console.log('0x1' + '1' - '1e1'); a) 17 b) 7 c) '0x111e1' d) NaN
الإجابة + تحليلب) 7
هناك بالفعل خطوط بعد '0x11' - '1e1'
الأول ، نحصل على: '0x11' - '1e1'
. بسبب علامة -
نأتي كل شيء إلى عدد.
0x11
- الرقم السداسي عشري في العشرية هو 17
.
1e1
- النموذج الأسي هو نفسه 1 * 10 ** 1
- أي فقط 10
typeof:
ما سوف يخرج هذا الرمز؟
let foo = () => { return null; }; console.log( typeof typeof foo ); a) 'function' b) 'string' c) 'null' d)
ما سوف يخرج هذا الرمز؟
typeof function() {}.prototype; a) 'function' b) 'object' c) 'undefined' d)
الإجابة + تحليلب) "كائن"
typeof
دائمًا بإرجاع سلسلة ، لها أولوية أقل من استدعاء الوظيفة ، وبالتالي يتم تنفيذ الوظيفة أولاً ، ويتم تطبيق typeof
على النتيجة التي يتم إرجاعها إليها. كائنات دالة ترث من Function.prototype. الشفق يحدد بوضوح أن هذا هو كائن.
حلقة الحدث:
لنبدأ بسؤالين عن الوعود.
ما سوف يخرج هذا الرمز؟
Promise.reject() .then(() => console.log(1), () => console.log(2)) .then(() => console.log(3), () => console.log(4)); a) 1 4 b) 1 3 c) 2 3 d) 2 4
ما سوف يخرج هذا الرمز؟
Promise.reject('foo') .then(() => Promise.resolve('bar'), () => {}) .then((a) => {console.log(a)}) a) foo b) bar c) undefined d)
الإجابة + تحليلج) غير محدد
Promise.reject
- إرجاع وعد في حالة مرفوضة.
يجب أن نتذكر أنه then
يأخذ 2 معلمات ، عمليات onFulfill
و onReject
. إذا حدث خطأ قبل then
، onReject
رد الاتصال onReject
. إذا لم يكن هناك خطأ في ذلك ، onFulfill
إلى onFulfill
بعد then
. ولا تنسَ أن () => {}
لا تُرجع كائنًا فارغًا ، ولكن undefined
، من أجل إرجاع كائن فارغ ، يجب أن تكتب بالشكل التالي: () => ({})
ترتيب المهام.
ما سوف يخرج هذا الرمز؟
async function get1() { return 1; } function get2() { return 2; } (async () => { console.log(await get1()); })(); console.log(get2()); a) 1,2 b) 2,1 c) 1 d) 2
ما سوف يخرج هذا الرمز؟
setTimeout(() => {console.log('in timeout')}); Promise.resolve() .then(() => {console.log('in promise')}); console.log('after'); a) in timeout, in promise, after b) after, in promise, in timeout c) after, in timeout, in promise d) in timeout, after, in promise
الجوابب) بعد ، في وعد ، في المهلة
ما سوف يخرج هذا الرمز؟
let __promise = new Promise((res, rej) => { setTimeout(res, 1000); }); async function test(i) { await __promise; console.log(i); } test(1); test(2); a) 1, 2 b) 2, 1 c) 1 d) 2
ما سوف يخرج هذا الرمز؟
console.log('FUS'); setTimeout(() => {console.log('RO')}) Promise.resolve('DAH!').then(x => console.log(x)); a FUS RO DAH! b) FUS DAH! RO c) RO FUS DAH! d) DAH! RO FUS
ما سوف يخرج هذا الرمز؟
console.log(1); setTimeout(() => console.log('setTimeout'), 0); console.log(2); Promise.resolve().then(() => console.log('promise1 resolved')); console.log(3); a) 1, 2, 3, 'setTimeout', 'promise1 resolved' b) 1, 'setTimeout', 2, 'promise1 resolved', 3 c) 1, 2, 3, 'promise1 resolved', 'setTimeout' d) 1, 2, 'promise1 resolved', 3, 'setTimeout'
الإجابة + تحليلج) 1 ، 2 ، 3 ، "الوعد 1 حل" ، "setTimeout"
أولاً ، يتم تشغيل جميع المكالمات المتزامنة ، وبعد ذلك ، عندما تكون مكدس الاستدعاءات فارغة ، فإن ما هو موجود في قائمة الانتظار يسمى (المهام غير المتزامنة). أولا ، microtask - وعود ومراقبة mutation observer
. في نهاية المهمة الحالية ، يتم تنفيذ جميع المهام الدقيقة ، فيما يتعلق بهذه المهمة الدقيقة ، يمكنك حظر حلقة الحدث ، وبعد اكتمال المهمة في المستعرض ، يحدث التجسيد. بعد ذلك ، يتم تنفيذ مهام الماكرو - المهلات.
هذا مثال مبسط للغاية ، وبمزيد من التفصيل ، أنصحك برؤية خطاب ميخائيل باشوروف
والسؤال الأخير وعد مقابل تنتظر
ما سوف يخرج هذا الرمز؟
const p = Promise.resolve(); (async () => { await p; console.log('1'); })(); p.then(() => console.log('2')) .then(() => console.log('3'));
أ) 1 2 3
ب) 2 1 3
ج) 2 3 1
د) 3 2 1
الإجابة + تحليلج) 2 3 1
وفقًا للمواصفات ، يجب أولاً تنفيذ الوعود التي تمت من خلالها ، وبعد ذلك فقط تحتاج إلى المتابعة
تنفيذ وظيفة غير متزامن. شبيك . للحصول على فهم أكثر تفصيلاً عن سبب ذلك ، أنصحك بقراءة مقال ممتاز حول v8.dev