Ամեն մի երեք JavaScript կոդի կտորների համար որոշեք, թե ինչ կցուցադրվի կոնսոլում և բացատրեք պրիմիտիվների, օբյեկտների և հղումների վերանվանման վարքագծի տարբերությունները։
Frontend
Կա՞ խնդիրներ ինտեգրված օբյեկտների պրոտոտիպների մեջ նոր մեթոդներ ավելացնելու հետ:
/** * Պետք է գրել ասինխրոն ֆունկցիա, * որը կքննի նշված միլիսեկունդների քանակը, * և հետո հաջողությամբ ավարտվի * / function sleep(duration) { } // Օրինակ const startTime = Date.now(); console.log("սկիզբը քուն..."); sleep(2000).then(() => { console.log("Երկու վայրկյանից հետո արթնացա!"); console.log("անցած ժամանակը: ", Date.now() - startTime); }); sleep(1000).then(() => { console.log("Մի վայրկյանից հետո արթնացա!"); console.log("անցած ժամանակը: ", Date.now() - startTime); });
Ինչու կարող է անհրաժեշտ լինել apply մեթոդը runOnce լուծման մեջ?
/** * Իրականացրեք sumPromises ֆունկցիան, որը * ընդունում է խոստումներ որպես արգումենտներ և վերադարձնում * դրանց արդյունքների գումարը: * * Ֆունկցիան կարող է ընդունել ցանկացած քանակի արգումենտ: * Կարող եք օգտագործել ցանկացած խոստման API: */ // Կոդ այստեղ // Օգտագործման օրինակ const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); sumPromises(promise1, promise2).then(console.log); // 3
/* Անհրաժեշտ է գրել ֆունկցիա, որը կհաշվարկի մասիվի բոլոր թվային արժեքների գումարը: valide թվային արժեքներն են նաև տողեր, որոնք սկսվում են թվանշաններով։ Այդ դեպքում, այս սկզբնական թվանշանների հաջորդականությունը պետք է օգտագործել որպես թվային արժեք։ Մասիվը կարող է պարունակել ցանկացած տիպի տվյալներ և լինել ոչ հարթ։ **Արգելվում է օգտագործել ներքին մեթոդներ, ինչպիսիք են .flat, .flatMap** */ function sum(arr) { // ... } console.log(sum([1, 'x', '2x', ['3', ['x2', '5']]]));
/** * Իրականացրեք runOnce փաթեթավորման ֆունկցիան, որը * ընդունում է ֆունկցիա և վերադարձնում նոր ֆունկցիա: Նոր * ֆունկցիան կարող է կանչվել միայն մեկ անգամ, բոլոր * հաջորդ կանչերը վերադարձնում են undefined: * * Փաթեթավորված ֆունկցիան կարող է ընդունել արգումենտներ * և վերադարձնել արդյունք: */ function runOnce(fn) { // ձեր կոդը } const logHello = (name) => { console.log(`բարև, ${name}!`) }; const logHelloOnce = runOnce(logHello); console.clear(); logHelloOnce('Oleg'); // 'բարև, Oleg!' logHelloOnce('Olga'); // undefined
/** * `asyncAuth(callback)` ֆունկցիան ընդունում է callback, որի մեջ * կարող են փոխանցվել սխալ (առաջին արգումենտով) և տվյալներ * բեկենդից (երկրորդ արգումենտով): * asyncAuth((error, data) => {}); * * Ձեզ անհրաժեշտ է իրականացնել `auth()` ֆունկցիան, * որը կանչում է `asyncAuth()`, բայց վերադարձնում է Promise: * * @returns {Promise} */ function auth() { return new Promise((resolve, reject) => { asyncAuth((error, data) => { if (error) { reject(error) } else { resolve(data) } }); }) } /** * `tryAuth()` ֆունկցիան օգտագործում է `auth()` և, սխալի դեպքում, * կատարում է N լրացուցիչ փորձեր: * * Եթե բոլոր փորձերը ձախողվեն, վերադարձնում է վերջին սխալը: * * @returns {Promise} */ function tryAuth(n) { }
[անուն] հարցրեց: Քանի ժամանակ տևեց խաղացողի MVP տարբերակի իրականացմանը:
Ի՞նչ նորամուծություններ են օգտագործվում ES6 ստանդարտից՝ գրված կոդում: Ի՞նչ է arguments օբյեկտը և ինչպե՞ս է այն տարբերվում rest-պարամետրերից:
Ինչպե՞ս փոխարկել arguments-ները հին ձևով (ES5), առանց Array.from և spread-օպերատորի։
Կարող եք պատմել այն ճարտարապետական մոտեցումների մասին, որոնք դուք օգտագործել եք նախագծում: Դու գիտե՞ք Feature-Sliced Design (FSD)-ը։
/** * Երեք կոդի հատվածներ են տրված։ Պետք է գրեք յուրաքանչյուր console.log-ի արդյունքը։ */ var n = 1; function F(n) { n = 3; } F(n); console.log(n); var obj = { a: 1 }; function F1(o) { o.a = 5; } F1(obj); console.log(obj); var obj = { a: 1 }; function F2(o) { o = { hello: 1 }; } F2(obj); console.log(obj);
[անուն] հարցրեց: Ինչպե՞ս էր ընդհանուր առմամբ կազմակերպված աշխատանքը կոնկրետ առաջադրանքի վրա՝ ով էր այն բերում և պատրաստում, ինչպես էր հաստատման գործընթացը, ինչ հարցեր էին առաջանում իրականացման ընթացքում և ինչպես եք դրանք լուծում?
[անուն] հարցրեց: Օնլայն պայպլայնում արդյոք ինքն եք գրել լրացուցիչ աշխատանքներ?
Կատարեք asyncAuth ֆունկցիան callback ինտերֆեյսով, որը վերադարձնում է Promise: Այնուհետև իրականացրեք tryAuth(n) ֆունկցիան, որը օգտագործում է asyncAuth և սխալի դեպքում կատարում է n լրացուցիչ փորձ: Եթե բոլոր փորձերը ձախողվեն, վերադարձնում է վերջին սխալը.
[անուն] հարցրեց: Օրե՞նք եք աշխատել ծառայությունների արագության չափանիշների օպտիմալացման վրա։
/** * `asyncAuth(callback)` գործառույթը ընդունում է callback, որի մեջ * կարող է փոխանցվել սխալ (առաջին արգումենտով) և տվյալներ * բեկենդից (երկրորդ արգումենտով): * asyncAuth((error, data) => {}); * * Դուք պետք է իրականացնել `auth()` գործառույթը, * որը կանչում է `asyncAuth()`, բայց վերադարձնում է Promise: * * @returns {Promise} */ function auth() { // asyncAuth((error, data) => {}); } /** * `tryAuth()` գործառույթը օգտագործում է `auth()` և, սխալ դեպքում, * անում N լրացուցիչ փորձեր: * Եթե բոլորն անհաջող լինեն, վերադարձնում է վերջին սխալը: * * @returns {Promise} */ function tryAuth(n) { }
Եթե ֆունկցիան հաջողությամբ կատարվելուց հետո ժամանակաչափը չմաքրվի, ինչ կլինի? Ինչպես դա ուղղել և որ խոստման մեթոդը կպատահի ժամանակաչափը մաքրել ցանկացած դեպքում (հաջողություն և սխալ)?
Կատարեք withTimeout ֆունկցիան, որը ընդունում է ֆունկցիա և ժամանակ (միլիսեկունդներ) և վերադարձնում է նոր ֆունկցիա: Եթե սկզբնական ֆունկցիան չի կատարվի նշված ժամանակում, խոստումը պետք է մերժվի։