تحليل الأسئلة في موقف hh.ru على # HolyJS18

حاولنا القيام بشيء مثير للاهتمام وغير عادي بالنسبة لك. آمل حقاً أن ننجح. لم نكن نريد أن نتركك دون إجابة ولا يوجد سبب لذلك. هيا بنا


بادئ ذي بدء ، أود أن أذكركم كيف أجريت المسابقة ، كان هناك 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 

الجواب

ج) 0.010000000000000002


ما سيتم عرضه في وحدة التحكم؟


 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)  

الجواب

ب) 2 ، 2


ما سوف يخرج هذا الرمز؟


 (() => { '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,  

الجواب

د) 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)  

الجواب

أ) 5


ما سوف يخرج هذا الرمز؟


 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 

الجواب

ب) 3


ما سوف يخرج هذا الرمز؟


 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 

الجواب

ج) 6


ما سوف يخرج هذا الرمز؟


 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 

الجواب

ج) 2


ما سوف يخرج هذا الرمز؟


 console.log(0 || '' || 2 || undefined || true || false); a) 0 b) false c) 2 d) true 

الجواب

ج) 2


ما سوف يخرج هذا الرمز؟


 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 

الجواب

د) 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 

الجواب

ب) غير محدد 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 

الجواب

ج) 2 3


ما سوف يخرج هذا الرمز؟


 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 

الجواب

ب) 2.1


ما سوف يخرج هذا الرمز؟


 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 

الجواب

أ) 1 ، 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

Source: https://habr.com/ru/post/ar431698/


All Articles