Sobes.tech

Αν η λειτουργία logHello έχει γραφτεί ως βέλος και καλείται μέσω fn.call(this, ...args) μέσα σε runOnce, τι θα συμβεί με το context this; Τι πρέπει να αλλάξει στη λειτουργία logHello ώστε το context να μεταφέρεται σωστά;

243

Γράψτε μια συνάρτηση για τη μετατροπή μιας συμβολοσειράς από camelCase σε snake_case. Δεν πρέπει να χρησιμοποιούνται κανονικές εκφράσεις, κωδικοί χαρακτήρων ή στατικά ορισμένες λίστες συμβόλων; η λύση πρέπει να είναι καθολική. Αξιολογήστε τη χρονική και χωρική πολυπλοκότητα.

237

Γιατί όταν καλούμε δύο φορές sleep(2000) και sleep(1000), εμφανίζεται πρώτα το λογισμικό για 1 δευτερόλεπτο και μετά για 2; Εξηγήστε τη λειτουργία του Event Loop, των μικρο- και μακρο-εργασιών.

221

/* Έχουμε ένα σύνολο εισιτηρίων με την ακόλουθη μορφή: [ { from: 'Λονδίνο', to: 'Μόσχα' }, { from: 'ΝΥ', to: 'Λονδίνο' }, { from: 'Μόσχα', to: 'Αγία Πετρούπολη' }, ... ] Από αυτά τα εισιτήρια μπορεί να κατασκευαστεί μια μοναδική, συνεχής διαδρομή. Δεν υπάρχουν κύκλοι ή επαναλήψεις στη διαδρομή. Πρέπει να γράψετε ένα πρόγραμμα που να επιστρέφει αυτά τα ίδια αντικείμενα εισιτηρίων σε σειρά σύμφωνα με τη διαδρομή. */ function getRoute(tickets = [], startCity) { // ο κώδικάς σας εδώ } console.clear() console.log(getRoute([ { from: 'Λονδίνο', to: 'Μόσχα' }, { from: 'ΝΥ', to: 'Λονδίνο' }, { from: 'Μόσχα', to: 'Αγία Πετρούπολη' }, ], 'ΝΥ')); /* [ { from: 'ΝΥ', to: 'Λονδίνο' }, { from: 'Λονδίνο', to: 'Μόσχα' }, { from: 'Μόσχα', to: 'Αγία Πετρούπολη' }, ] */

217

Γνώση βάσεων δεδομένων και εργασίας με API

217

/** * Η λειτουργία `asyncAuth(callback)` δέχεται ένα callback, στο οποίο * μπορεί να περαστεί ένα σφάλμα (ως πρώτο όρισμα) και δεδομένα * από το backend (ως δεύτερο όρισμα). * asyncAuth((error, data) => {}); * * Πρέπει να υλοποιήσετε τη λειτουργία `auth()`, * που καλεί το `asyncAuth()`, αλλά επιστρέφει μια υπόσχεση. * * @returns {Promise} */ function auth() { // asyncAuth((error, data) => {}); } /** * Η λειτουργία `tryAuth()` χρησιμοποιεί το `auth()` και, σε περίπτωση σφάλματος, * κάνει N επιπλέον προσπάθειες. * Αν όλες αποτύχουν, επιστρέφει το τελευταίο σφάλμα. * * @returns {Promise} */ function tryAuth(n) { }

208

/* Πρέπει να γραφεί ένα polyfill για το Array.prototype.some Παράμετροι - callback - λειτουργία που ελέγχει κάθε στοιχείο, δέχεται τρία επιχειρήματα: - element - Το τρέχον επεξεργαζόμενο στοιχείο στον πίνακα. - index (Προαιρετικό) - Ο δείκτης του τρέχοντος επεξεργαζόμενου στοιχείου. - array (Προαιρετικό) - Ο πίνακας πάνω στον οποίο γίνεται η επανάληψη. - thisArg (Προαιρετικό) - Τιμή που χρησιμοποιείται ως this κατά την εκτέλεση της λειτουργίας callback. Τιμή επιστροφής true, αν η λειτουργία ελέγχου επιστρέφει μια truthy τιμή για τουλάχιστον ένα στοιχείο. Διαφορετικά, false. */ Array.prototype.some = function (callback, thisArgs) { const array = this; for (let i = 0; i < array.length; i++) { if (!(i in array)) continue; const result = callback.call(thisArgs, array[i], i, array); if (result) return true; } return false; }

195

Αν πρέπει να λάβουμε υπόψη δεκαδικούς αριθμούς, τι πρέπει να προσθέσουμε στη μέθοδο times;

193

Σε τι άλλο χρειάστηκε να γράψετε στην επαγγελματική σας εμπειρία, εκτός από TypeScript και JavaScript;

192

/** * Η λειτουργία '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) { return new Promise((resolve, reject) => { function attempt(attemptsLeft) { auth().then(resolve).catch((error) => { if (attemptsLeft <= 0) { reject(error); } else { attempt(attemptsLeft - 1); } }); } attempt(n); }); }

192

Σε ποια ομάδα εργάζεστε και σε ποιο έργο;

184

Μπορεί να λυθεί ένα πρόβλημα άθροισης υποσχέσεων χωρίς τη χρήση στατικών μεθόδων Promise; Πώς θα διαφέρει η εκτέλεση των υποσχέσεων μέσα σε έναν βρόχο από το Promise.all — παράλληλα ή διαδοχικά;

177

Υπάρχει ένα δέντρο στο οποίο κάθονται σκίουροι και κοράκια. Είναι απαραίτητο να γράψουμε μια συνάρτηση που βρίσκει όλους τους σκίουρους στο δέντρο και επιστρέφει τα ονόματά τους. Αναμενόμενο αποτέλεσμα: ['Acorn', 'Sirsalty', 'Macadamia', 'Kernel'].

169

Τι είναι προτιμότερο για την αποθήκευση δεδομένων ανά κλειδί: Map ή ένα συνηθισμένο αντικείμενο; Ποια είναι τα πλεονεκτήματα του Map;

169

/** * Υλοποιήστε τη λειτουργία runOnce, η οποία λαμβάνει * μια λειτουργία και επιστρέφει μια νέα λειτουργία. Η νέα * λειτουργία μπορεί να κληθεί μόνο μία φορά, όλες οι επόμενες * κλήσεις επιστρέφουν undefined. * * Η τυλιγμένη λειτουργία μπορεί να δέχεται επιχειρήματα * και να επιστρέφει ένα αποτέλεσμα. */ function runOnce(fn) { // ο κώδικάς σας } const logHello = (name) => { console.log(`γεια σου, ${name}!`) }; const logHelloOnce = runOnce(logHello); console.clear(); logHelloOnce('Oleg'); // 'γεια σου, Oleg!' logHelloOnce('Olga'); // undefined

167

Καθορίστε τη σειρά εξόδου στην κονσόλα και τις τιμές του μετρημένου χρόνου στο παράδειγμα με sleep, timers, Promise και ουρές εργασιών; εξηγήστε γιατί η πραγματική καθυστέρηση μπορεί να είναι μεγαλύτερη από αυτή που έχει οριστεί.

167

Εφαρμόστε έναν διακοσμητή callLimit(fn, limit, callback), ο οποίος περιορίζει τον αριθμό των κλήσεων της λειτουργίας. Δέχεται: μια λειτουργία προς διακόσμηση, τον μέγιστο αριθμό κλήσεων, ένα callback, που καλείται στην τελευταία κλήση (προαιρετικά). Η επιστρεφόμενη λειτουργία πρέπει να έχει μια μέθοδο reset για επαναφορά του μετρητή στην αρχική θέση.

167

Τι σας αρέσει και τι δεν σας αρέσει στη δουλειά σας στην εταιρεία;

164

/** * Πρέπει να γράψετε μια συνάρτηση strjoin, * που ενώνει τις συμβολοσειρές με διαχωριστικό. */ function strjoin() { // κώδικας εδώ } console.log(strjoin('.', 'a', 'b', 'c')) // 'a.b.c' console.log(strjoin('-', 'a', 'b', 'c', 'd', 'e', 'f')) // 'a-b-c-d-e-f'

160

/** * Είναι απαραίτητο να γράψετε μια ασύγχρονη λειτουργία, * που θα "κοιμάται" τον καθορισμένο αριθμό χιλιοστών, * και στη συνέχεια θα ολοκληρώνεται με επιτυχία */ 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); });

160
/6