Μια γρήγορη εισαγωγή για λειτουργίες υψηλότερης παραγγελίας σε JavaScript
Λειτουργίες υψηλότερης τάξης
Μια συνάρτηση που αποδέχεται και / ή επιστρέφει μια άλλη συνάρτηση ονομάζεται συνάρτηση υψηλότερης τάξης .
Είναι υψηλότερης τάξης επειδή αντί για συμβολοσειρές, αριθμούς ή booleans, πηγαίνει υψηλότερα για να λειτουργεί σε συναρτήσεις. Αρκετά μετα.
Με λειτουργίες σε JavaScript, μπορείτε
- Αποθηκεύστε τα ως μεταβλητές
- Χρησιμοποιήστε τα σε πίνακες
- Ορίστε τις ως ιδιότητες αντικειμένου (μέθοδοι)
- Περάστε τα ως επιχειρήματα
- Επιστρέψτε τα από άλλες λειτουργίες
Όπως κάθε άλλο κομμάτι δεδομένων . Αυτό είναι το κλειδί εδώ.
Οι λειτουργίες λειτουργούν σε δεδομένα
Οι συμβολοσειρές είναι δεδομένα
sayHi = (name) => `Hi, ${name}!`; result = sayHi('User'); console.log(result); // 'Hi, User!'
Οι αριθμοί είναι δεδομένα
double = (x) => x * 2; result = double(4); console.log(result); // 8
Τα Booleans είναι δεδομένα
getClearance = (allowed) => (allowed ? 'Access granted' : 'Access denied'); result1 = getClearance(true); result2 = getClearance(false); console.log(result1); // 'Access granted' console.log(result2); // 'Access denied'
Τα αντικείμενα είναι δεδομένα
getFirstName = (obj) => obj.firstName; result = getFirstName({ firstName: 'Yazeed' }); console.log(result); // 'Yazeed'
Οι πίνακες είναι δεδομένα
len = (array) => array.length; result = len([1, 2, 3]); console.log(result); // 3
Αυτοί οι 5 τύποι είναι πολίτες πρώτης κατηγορίας σε κάθε γενική γλώσσα.
Τι τους κάνει πρώτης τάξεως; Μπορείτε να τα περάσετε, να τα αποθηκεύσετε σε μεταβλητές και πίνακες, να τα χρησιμοποιήσετε ως εισόδους για υπολογισμούς. Μπορείτε να τα χρησιμοποιήσετε όπως οποιοδήποτε κομμάτι δεδομένων .
Οι συναρτήσεις μπορεί να είναι πολύ δεδομένα
Λειτουργεί ως Επιχειρήματα
isEven = (num) => num % 2 === 0; result = [1, 2, 3, 4].filter(isEven); console.log(result); // [2, 4]
Δείτε πώς filter
χρησιμοποιεί isEven
για να αποφασίσετε ποιοι αριθμοί πρέπει να διατηρήσετε; isEven
, μια συνάρτηση , ήταν μια παράμετρος μιας άλλης συνάρτησης .
Καλείται από filter
κάθε αριθμό και χρησιμοποιεί την επιστρεφόμενη τιμή true
ή false
για να καθορίσει εάν ένας αριθμός πρέπει να διατηρηθεί ή να απορριφθεί.
Επιστρέφοντας συναρτήσεις
add = (x) => (y) => x + y;
add
απαιτεί δύο παραμέτρους, αλλά όχι όλες ταυτόχρονα. Είναι μια συνάρτηση που ζητάει δίκαια x
, επιστρέφει μια συνάρτηση που ζητάει δίκαια y
.
Και πάλι, αυτό είναι εφικτό μόνο επειδή η JavaScript επιτρέπει στις λειτουργίες να είναι μια τιμή επιστροφής - όπως οι συμβολοσειρές, οι αριθμοί, τα booleans κ.λπ.
Μπορείτε ακόμα να προμηθεύσετε x
και y
αμέσως, αν θέλετε, με διπλή επίκληση
result = add(10)(20);
console.log(result); // 30
Ή x
τώρα και y
αργότερα:
add10 = add(10); result = add10(20); console.log(result); // 30
Ας επαναφέρουμε αυτό το τελευταίο παράδειγμα. add10
είναι το αποτέλεσμα της κλήσης add
με μία παράμετρο. Δοκιμάστε να το συνδέσετε στην κονσόλα.
add10
είναι μια συνάρτηση που παίρνει ένα y
και επιστρέφει x + y
. Μετά την παράδοση y
, βιάζεται να υπολογίσει και να επιστρέψει το τελικό αποτέλεσμα.
Μεγαλύτερη επαναχρησιμοποίηση
Πιθανώς το μεγαλύτερο όφελος των HOFs είναι η μεγαλύτερη επαναχρησιμοποίηση. Χωρίς αυτά, οι μέθοδοι πρεμιέρα Array την Javascript για - map
, filter
και reduce
- δεν θα υπάρχει!
Ακολουθεί μια λίστα χρηστών. Θα κάνουμε μερικούς υπολογισμούς με τις πληροφορίες τους.
users = [ { name: 'Yazeed', age: 25 }, { name: 'Sam', age: 30 }, { name: 'Bill', age: 20 } ];
Χάρτης
Χωρίς λειτουργίες υψηλότερης τάξης, θα χρειαζόμασταν πάντα βρόχους για να μιμηθούμε map
τη λειτουργικότητα.
getName = (user) => user.name; usernames = []; for (let i = 0; i < users.length; i++) { const name = getName(users[i]); usernames.push(name); } console.log(usernames); // ["Yazeed", "Sam", "Bill"]
Ή θα μπορούσαμε να το κάνουμε αυτό!
usernames = users.map(getName); console.log(usernames); // ["Yazeed", "Sam", "Bill"]
Φίλτρο
Σε έναν κόσμο χωρίς HOF, θα χρειαζόμασταν ακόμη βρόχους για να αναδημιουργήσουμε filter
τη λειτουργικότητα.
startsWithB = (string) => string.toLowerCase().startsWith('b'); namesStartingWithB = []; for (let i = 0; i < users.length; i++) { if (startsWithB(users[i].name)) { namesStartingWithB.push(users[i]); } } console.log(namesStartingWithB); // [{ "name": "Bill", "age": 20 }]
Ή θα μπορούσαμε να το κάνουμε αυτό!
namesStartingWithB = users.filter((user) => startsWithB(user.name)); console.log(namesStartingWithB); // [{ "name": "Bill", "age": 20 }]
Περιορίζω
Ναι, μειώστε επίσης ... Δεν μπορώ να κάνω πολύ ωραία πράγματα χωρίς λειτουργίες υψηλότερης τάξης !! ;
total = 0; for (let i = 0; i < users.length; i++) { total += users[i].age; } console.log(total); // 75
Πως είναι αυτό?
totalAge = users.reduce((total, user) => user.age + total, 0); console.log(totalAge); // 75
Περίληψη
- Οι συμβολοσειρές, οι αριθμοί, τα bools, οι πίνακες και τα αντικείμενα μπορούν να αποθηκευτούν ως μεταβλητές, πίνακες και ιδιότητες ή μέθοδοι.
- Το JavaScript αντιμετωπίζει τις λειτουργίες με τον ίδιο τρόπο.
- Αυτό επιτρέπει λειτουργίες που λειτουργούν σε άλλες λειτουργίες: λειτουργίες υψηλότερης τάξης .
- Ο χάρτης, το φίλτρο και η μείωση είναι πρωταρχικά παραδείγματα - και κάνουν τα πιο κοινά μοτίβα όπως η μετατροπή, η αναζήτηση και η αθροιστική λίστα πολύ πιο εύκολη!
Είμαι στο Twitter αν θέλετε να μιλήσετε. Μέχρι την επόμενη φορά!
Να προσέχεις,
Yazeed Bzadough
yazeedb.com