Διαδρομές
/
JavaScript
JavaScript
/
Ασκήσεις
/
Ρομπότ Ανακύκλωσης
Ρομπότ Ανακύκλωσης

Ρομπότ Ανακύκλωσης

Άσκηση εκμάθησης

Εισαγωγή

Το να γνωρίζεις τον τύπο ενός δεδομένου είναι συχνά πολύ σημαντικό για να τρέχει ο κώδικας ομαλά και χωρίς σφάλματα.

Η JavaScript έχει αρκετούς τρόπους για να ελέγξεις τον τύπο μιας τιμής ή ενός αντικειμένου.

Note

Οι μηχανισμοί ελέγχου τύπων της JavaScript μπορεί να είναι κάπως αναξιόπιστοι.

Για καλύτερη ασφάλεια τύπων και ισχυρότερους τύπους, πιθανότατα θα πρέπει να χρησιμοποιήσεις TypeScript, μια γλώσσα που βασίζεται στη JavaScript, αλλά με τη σύνταξη τύπων μιας γλώσσας στατικής τυποποίησης.

Ο τελεστής typeof

Ο τελεστής typeof επιστρέφει τον τύπο του τελεστέου του. Η έξοδος είναι μια συμβολοσειρά που ταιριάζει με το όνομα ενός από τους πρωτόγονους τύπους δεδομένων, εκτός από το "null". Μπορεί επίσης να είναι "function" ή "object".

typeof undefined;
// => "undefined"

typeof true;
// => "boolean"

typeof 42;
// => "number"

typeof 'Hello, World!';
// => "string"

typeof function () {
  return 'Hello, World';
};
// => "function"

typeof [1, 2, 3, 4];
// => "object"

typeof { city: 'Stockholm', country: 'Sweden' };
// => "object"

Για [ιστορικούς λόγους][typeof null is "object"].

Ο τελεστής instanceof

Για να ελέγξεις τον τύπο ενός αντικειμένου, μπορείς να χρησιμοποιήσεις τον τελεστή instanceof. Αξιολογείται σε boolean ανάλογα με το αν ο δεύτερος τελεστέος περιλαμβάνεται στην αλυσίδα πρωτοτύπων του πρώτου τελεστέου. Για να το ξεκαθαρίσουμε, ο instanceof θα επιστρέψει αν ο πρώτος τελεστέος είναι στιγμιότυπο του δεύτερου τελεστέου ή μιας από τις υποκλάσεις του. Ο instanceof λειτουργεί μόνο σε αντικείμενα.

class Beverage {
  // ...
}

// The Coffee class is a child of the Beverage class.
class Coffee extends Beverage {
  // ...
}

const java = new Coffee();

java instanceof Coffee;
// => true

java instanceof Beverage;
// => true
Advanced

Η κλάση Array έχει μια μέθοδο που ονομάζεται Array.isArray() και ελέγχει αν το όρισμά της είναι πίνακας.

Ενώ το instanceof Array δε θα λειτουργήσει με έναν πίνακα που δημιουργήθηκε σε διαφορετικό περιβάλλον εκτέλεσης, όπως ένα iframe σε μια ιστοσελίδα, το Array.isArray() θα λειτουργήσει.

Αυτό συμβαίνει επειδή η κλάση Array έχει διαφορετικό κατασκευαστή σε κάθε περιβάλλον εκτέλεσης, και κάθε iframe έχει το δικό του περιβάλλον, που σημαίνει ότι η συνάρτηση στην αλυσίδα πρωτοτύπων θα είναι διαφορετική, με αποτέλεσμα το instanceof Array να αποτυγχάνει. Το Array.isArray() μπορεί να το αγνοήσει αυτό και θα πρέπει να χρησιμοποιείται πάντα όταν είναι δυνατόν.

Μπορεί επίσης να αποφύγει ψευδώς θετικά αποτελέσματα, όπου ένα αντικείμενο δεν είναι στην πραγματικότητα Array και απλώς έχει το Array στην αλυσίδα πρωτοτύπων του.

({ __proto__: Array.prototype }) instanceof Array
// => true

Array.isArray({ __proto__: Array.prototype })
// => false

Ο τελεστής in

Ο τελεστής in επιστρέφει αν ο πρώτος τελεστέος είναι ιδιότητα του δεύτερου τελεστέου. Δεν ελέγχει αν η ιδιότητα έχει καθορισμένη τιμή. Μια ιδιότητα ορισμένη σε undefined θα εντοπιστεί ακόμα και από τον in.

class Coffee {
  constructor() {
    this.temperature = 'hot';
    this.isDarkMatter = undefined;
  }

  coolDown() {
    this.temperature = 'warm';
  }
}

const espresso = new Coffee();

'temperature' in espresso;
// => true

'color' in espresso;
// => false

'isDarkMatter' in espresso;
// => true
Note

Ο in θα επιστρέψει true για κληρονομημένες ιδιότητες και μεθόδους.

"coolDown" in espresso
// => true

"constructor" in espresso
// => true

Για να το αποφύγεις αυτό, χρησιμοποίησε αντ' αυτού το Object.hasOwn()

Η συνάρτηση Object.hasOwn()

Η μέθοδος Object.hasOwn() επιστρέφει αν το καθορισμένο αντικείμενο κατέχει τη δεδομένη ιδιότητα (δεν είναι κληρονομημένη ή μέθοδος).

class Coffee {
  constructor() {
    this.temperature = 'hot';
  }

  coolDown() {
    this.temperature = 'warm';
  }
}
const cappuccino = new Coffee();

Object.hasOwn(cappucino, 'temperature');
// => true

Object.hasOwn(cappucino, 'constructor');
// => false

Object.hasOwn(cappucino, 'coolDown');
// => false

Οδηγίες

Οδηγίες

Σε έχουν προσλάβει σε ένα κέντρο ανακύκλωσης. Λόγω έλλειψης χώρου, όλα τα προϊόντα μπαίνουν στον ίδιο ιμάντα μεταφοράς, αλλά αυτό έχει οδηγήσει στο να αναμειγνύονται διαφορετικά υλικά μεταξύ τους, με αποτέλεσμα να γίνονται άχρηστα. Για να το διορθώσεις, σου έχει ανατεθεί να φτιάξεις συναρτήσεις που αναγνωρίζουν τον τύπο ενός προϊόντος.

1. Έλεγξε αν μια τιμή είναι boolean (λογική τιμή)

Υλοποίησε τη συνάρτηση isBoolean, που ελέγχει αν μια τιμή είναι boolean.

isBoolean(true);
// => true

isBoolean(null);
// => false

2. Έλεγξε αν μια τιμή είναι ένας αριθμός.

Υλοποίησε τη συνάρτηση isNumber, που ελέγχει αν μια τιμή είναι ένας πεπερασμένος number ή bigint, δηλαδή όχι NaN ή Infinity.

Μερικές φορές, η συσκευή ανάγνωσης ID αποτυγχάνει και διαβάζει μια μη αριθμητική τιμή ως NaN (Not a Number) ή Infinity. Η συνάρτησή σου θα πρέπει να μπορεί να το χειριστεί σωστά κι αυτό.

isNumber(42);
// => true

isNumber('Hello, World!');
// => false

isNumber(42n);
// => true

isNumber(NaN);
// => false

3. Έλεγξε αν μια τιμή είναι αντικείμενο

Υλοποίησε τη συνάρτηση isObject, που θα πρέπει να ελέγχει αν η τιμή είναι αντικείμενο. Στον ιμάντα, το null δεν είναι τίποτα και δεν θεωρείται αντικείμενο.

isObject({ greeting: 'Hello' });
// => true

isObject(25n);
// => false

4. Έλεγξε αν μια συμβολοσειρά είναι αριθμητική

Υλοποίησε τη συνάρτηση isNumericString, που θα πρέπει να ελέγχει αν η τιμή είναι μια συμβολοσειρά που αποτελείται μόνο από ψηφία ή από ένα μείον ακολουθούμενο από ψηφία, που δηλώνει αρνητικό αριθμό. Μόνο οι ακέραιοι θα πρέπει να λαμβάνονται υπόψη, τα δεκαδικά δεν θεωρούνται αριθμητικά για αυτόν τον έλεγχο του ρομπότ ανακύκλωσης.

isNumericString(42);
// => false

isNumericString('42');
// => true

isNumericString('Hi!');
// => false

5. Έλεγξε αν ένα αντικείμενο είναι ηλεκτρονικό

Υλοποίησε τη συνάρτηση isElectronic, που ελέγχει αν ένα αντικείμενο είναι στιγμιότυπο της παρεχόμενης κλάσης ElectronicDevice ή μιας από τις υποκλάσεις της.

class Duck {
  //...
}

class WashingMachine extends ElectronicDevice {
  //...
}

isElectronic(new Duck());
// => false

isElectronic(new WashingMachine());
// => true

6. Έλεγξε αν μια τιμή είναι μη κενός πίνακας

Υλοποίησε τη συνάρτηση isNonEmptyArray, που ελέγχει αν μια τιμή είναι μη κενός πίνακας.

isNonEmptyArray([1, 2, 3]);
// => true

isNonEmptyArray([]);
// => false

7. Έλεγξε αν μια τιμή είναι κενός πίνακας

Υλοποίησε τη συνάρτηση isEmptyArray, που ελέγχει αν μια τιμή είναι κενός πίνακας.

isEmptyArray([1, 2, 3]);
// => false

isEmptyArray([]);
// => true

8. Έλεγξε αν ένα αντικείμενο έχει ιδιότητα ή μέθοδο type

Υλοποίησε τη συνάρτηση hasType, που ελέγχει αν ένα αντικείμενο έχει ιδιότητα ή μέθοδο type.

class Keyboard(){
  type(){
    // ...
  }
}
hasType({ type:"car", color:"red" })
// => true

hasType({ color:"green" })
// => false

hasType(new Keyboard())
// => true

9. Πέτα ένα σφάλμα αν ένα αντικείμενο δεν έχει ιδιότητα ή μέθοδο id

Υλοποίησε τη συνάρτηση assertHasId, που θα πετάει ένα Error αν από ένα αντικείμενο λείπει η ιδιότητα id.

Αν ένα αντικείμενο έχει την ιδιότητα id, δεν θα πρέπει να επιστρέφει τίποτα.

assertHasId({ id: 42, color: 'red' });
// => undefined

assertHasId({ color: 'green' });
// Error: "Object is missing the 'id' property"

10. Έλεγξε αν ένα αντικείμενο έχει ιδιότητα id

Υλοποίησε τη συνάρτηση hasIdProperty, που ελέγχει αν ένα αντικείμενο έχει ιδιότητα id.

class SimpleData {
  constructor() {
    this.number = '42';
    this.id = 'BC269327FE1D9B95';
  }
}

class StealingData extends SimpleData {}

class MethodData {
  constructor() {
    this.number = '42';
    this._id = 'BC269327FE1D9B95';
  }

  get id() {
    return this._id;
  }
}

hasIdProperty(new SimpleData());
// => true

hasIdProperty(new MethodData());
// => false

hasIdProperty(new StealingData());
// => false

11. Έλεγξε αν ένα αντικείμενο έχει ορισμένη ιδιότητα type

Υλοποίησε τη συνάρτηση hasDefinedType, που ελέγχει αν ένα αντικείμενο έχει ιδιότητα type που δεν είναι undefined.

hasDefinedType({ type: undefined, color: 'red' });
// => false

hasDefinedType({ type: 'car', color: 'green' });
// => true
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
JavaScript Exercism

Έτοιμος να ξεκινήσεις την άσκηση Ρομπότ Ανακύκλωσης;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.