/** * Υλοποιήστε τη συνάρτηση isMonotonic, η οποία λαμβάνει * έναν πίνακα αριθμών και καθορίζει αν είναι * μονοτονικός (μη αυξανόμενος ή μη φθίνων). * * @param {Array<number>} numbers - πίνακας αριθμών * @return {boolean} - true αν ο πίνακας είναι μονοτονικός, διαφορετικά false */ function isMonotonic(numbers) { // ο κώδικάς σας εδώ }
Frontend
/** * Είναι απαραίτητο να γράψετε μια ασύγχρονη λειτουργία, * που θα "κοιμάται" τον καθορισμένο αριθμό χιλιοστών δευτερολέπτων, * και στη συνέχεια θα ολοκληρώνεται με επιτυχία * / function sleep(duration) { } // Παράδειγμα const startTime = Date.now(); console.log("ξεκινάει ο ύπνος..."); sleep(2000).then(() => { console.log("Ξύπνησα μετά από 2 δευτερόλεπτα!"); console.log("Χρόνος που πέρασε: ", Date.now() - startTime); }); sleep(1000).then(() => { console.log("Ξύπνησα μετά από 1 δευτερόλεπτο!"); 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
/** * Η λειτουργία `asyncAuth(callback)` δέχεται ένα callback, στο οποίο * μπορεί να περαστεί ένα σφάλμα (ως πρώτο όρισμα) και δεδομένα * από το backend (ως δεύτερο όρισμα). * asyncAuth((error, data) => {}); * * Πρέπει να υλοποιήσετε τη λειτουργία `auth()`, * που καλεί το `asyncAuth()`, αλλά επιστρέφει μια υπόσχεση. * * @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 του παίκτη;
/* Είναι απαραίτητο να γράψετε μια συνάρτηση για τον υπολογισμό του αθροίσματος όλων των αριθμητικών τιμών σε έναν πίνακα. Έγκυρες αριθμητικές τιμές είναι επίσης συμβολοσειρές, που ξεκινούν με ψηφία. Σε αυτήν την περίπτωση, πρέπει να χρησιμοποιήσετε αυτή την αρχική ακολουθία ψηφίων ως αριθμητική τιμή. Ο πίνακας μπορεί να περιέχει οποιοδήποτε τύπο δεδομένων και να μην είναι επίπεδος. **Δεν πρέπει να χρησιμοποιήσετε ενσωματωμένες μεθόδους όπως .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
Πώς μετατρέπουμε τα arguments σε πίνακα με τον παλιό τρόπο (ES5), χωρίς Array.from και spread-operator;
Τι νέα από το πρότυπο ES6 χρησιμοποιούνται στον γραμμένο κώδικα; Τι είναι το αντικείμενο arguments και πώς διαφέρει από τις παραμέτρους rest;
/** * Δύο τμήματα κώδικα δίνονται. Είναι απαραίτητο να γράψετε το αποτέλεσμα κάθε 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);
Μπορείτε να μας πείτε για τις αρχιτεκτονικές προσεγγίσεις που χρησιμοποιήσατε στο έργο; Γνωρίζετε το Feature-Sliced Design (FSD);
Υλοποιήστε τη λειτουργία asyncAuth με μια διεπαφή callback που επιστρέφει μια Promise. Στη συνέχεια, υλοποιήστε τη λειτουργία tryAuth(n), η οποία χρησιμοποιεί το asyncAuth και σε περίπτωση σφάλματος κάνει n επιπλέον προσπάθειες. Αν όλες οι προσπάθειες αποτύχουν, επιστρέφει το τελευταίο σφάλμα.
[όνομα] ρώτησε: Πώς οργανωνόταν γενικά η εργασία σε ένα συγκεκριμένο έργο: ποιος το έφερνε και το προετοίμαζε, πώς γινόταν η διαδικασία έγκρισης, ποια ερωτήματα προέκυπταν κατά την υλοποίηση και πώς τα λύνατε;
Υλοποιήστε τη λειτουργία withTimeout, η οποία λαμβάνει μια λειτουργία και χρόνο (σε χιλιοστά του δευτερολέπτου) και επιστρέφει μια νέα λειτουργία. Αν η αρχική λειτουργία δεν εκτελεστεί εντός του καθορισμένου χρόνου, η υπόσχεση πρέπει να απορριφθεί.
/** * Η λειτουργία `asyncAuth(callback)` δέχεται ένα callback, στο οποίο * μπορεί να περαστεί ένα σφάλμα (ως πρώτο όρισμα) και δεδομένα * από το backend (ως δεύτερο όρισμα). * asyncAuth((error, data) => {}); * * Πρέπει να υλοποιήσετε τη λειτουργία `auth()`, * που καλεί το `asyncAuth()`, αλλά επιστρέφει μια υπόσχεση. * * @returns {Promise} */ function auth() { // asyncAuth((error, data) => {}); } /** * Η λειτουργία `tryAuth()` χρησιμοποιεί το `auth()` και, σε περίπτωση σφάλματος, * κάνει N επιπλέον προσπάθειες. * Αν όλες αποτύχουν, επιστρέφει το τελευταίο σφάλμα. * * @returns {Promise} */ function tryAuth(n) { }
Τι συμβαίνει αν δεν καθαρίσετε το timeout μετά την επιτυχή εκτέλεση της λειτουργίας; Πώς μπορείτε να το διορθώσετε και ποια μέθοδος υπόσχεσης θα ήταν κατάλληλη για τον καθαρισμό του timeout σε κάθε περίπτωση (επιτυχία και σφάλμα);
[όνομα] ρώτησε: Ποιο πλαίσιο δοκιμών χρησιμοποιήθηκε;
[όνομα] ρώτησε: Έχεις δουλέψει ποτέ στην βελτιστοποίηση των μετρικών ταχύτητας των υπηρεσιών;