Tuesday, July 10, 2018

ΕΝΟΤΗΤΑ 4 – PRIMITIVE DATA TYPES – NUMBERS

Κάθε μεταβλητή που χρησιμοποιούμε στην JavaScript θα περιέχει δεδομένα που θα ανήκουν σε μια από τις πιο κάτω κατηγορίες:

1. Number: Σε αυτή την κατηγορία ανήκουν οι ακέραιοι αλλά και οι δεκαδικοί αριθμοί.
2. String: Αποτελείται από οποιαδήποτε αριθμό χαρακτήρων
3. Boolean: Οι μόνες πιθανές τιμές που μπορούμε να έχουμε είναι true ή false
4. Undefined: Όταν προσπαθούμε να διαβάσουμε μια μεταβλητή που δεν υπάρχει ή υπάρχει αλλά δεν έχουμε ορίσει μια αρχική τιμή, τότε το αποτέλεσμα είναι undefined.
5. Null: Αυτό είναι ένα ειδικό είδος στοιχείου που έχει αποκλειστικά και μόνο μια τιμή – null. Η διαφορά ανάμεσα με το undefined είναι ότι μια μεταβλητή που ισούται με null έχει αρχικοποιηθεί απλά η αρχική της τιμή είναι null. Θα δείξουμε την διαφορά λίγο πιο κάτω στα παραδείγματα που θα αναλύσουμε.

Κάθε άλλη τιμή που δεν ανήκει σε μια από τις πιο πάνω κατηγορίες σημαίνει ότι είναι αντικείμενο (object). Έχοντας λοιπόν την πιο πάνω θεωρία στο μυαλό μας, μπορούμε να μιλάμε για δύο μεγάλες κατηγορίες στην JavaScript:
a. Primitive (με τις 5 κατηγορίες που μόλις αναφέραμε)
β. Non-primitive (αντικείμενα – objects)

Σε αυτή την ενότητα θα δούμε μερικά παραδείγματα στα number primitives. Αλλά πριν φτάσουμε σε αυτό το σημείο, ας λύσουμε πρώτα μια άλλη απορία που ίσως ήδη σκέφτεστε – πως μπορώ να γνωρίζω τι είδος τιμής έχει μια μεταβλητή ή αλλιώς ποιο είναι το data type της μεταβλητής?

Η απάντηση έρχεται από έναν operator που ονομάζεται typeof και όταν το καλούμε επιστρέφει το όνομα της κατηγορίας στην οποία ανήκει η μεταβλητή. Οι πιθανές απαντήσεις που μπορούμε να πάρουμε από τον typeof τελεστή είναι οι ακόλουθες:
  • number
  • string
  • boolean
  • undefined
  • object
  • function

Ας ξεκινήσουμε λοιπόν να βλέπουμε μερικά παραδείγματα που περιέχουν αριθμούς με τον πιο απλό παράδειγμα να είναι εκείνο που χρησιμοποιεί ακεραίους αριθμούς.



 
Παρατηρήστε ότι την δεύτερη φορά που αναθέσαμε την τιμή 1234 στην μεταβλητή a δεν χρειάστηκε να χρησιμοποιήσουμε την λέξη var μια και η μεταβλητή έχει ήδη οριστεί επίσημα μια φορά.

Φυσικά και οι αριθμοί εκτός από ακεραίους μπορεί να είναι και δεκαδικοί.



Αξίζει επίσης να σημειώσουμε το γεγονός ότι στην JavaScript μπορούμε να ορίσουμε και Octal όπως και hexadecimals αριθμούς. Όταν ο αριθμός ξεκινάει με μηδέν (π.χ. 0776) τότε αυτός θεωρείται octal αριθμός ενώ όταν ξεκινάει με 0X τότε θεωρείται hexadecimal. Το αποτέλεσμα όμως παραμένει number για τον typeof τελεστή. Επίσης έχουμε και δυαδικούς αριθμούς που με την έκδοση ES6 της JavaScript μπορούμε να προσθέσουμε 0B μπροστά από τον αριθμό (π.χ. 0B1111).

Υπάρχει μια ειδική τιμή που μπορεί να πάρει μια μεταβλητή που ονομάζεται Infinity. Το Infinity αντιπροσωπεύει έναν αριθμό που είναι πολύ μεγάλος σε μέγεθος και κατά συνέπεια αδυνατεί η JavaScript να τον χειριστεί. Ένας αριθμός με περισσότερα από 309 μηδενικά (η ψηφία) θα μας επιστρέψει Infinity όταν προσπαθήσουμε να το εκτυπώσουμε στην οθόνη μας ενώ στο typeof έλεγχο όπως δείχνει και το πιο κάτω παράδειγμα θα πάρουμε number σαν αποτέλεσμα που είναι σωστό γιατί το Infinity είναι κατά βάση αριθμός. Όπως επίσης θα πάρουμε Infinity όταν διαιρέσουμε οποιονδήποτε αριθμό με το μηδέν.




Για να ολοκληρώσουμε το πιο πάνω παράδειγμα, θα πρέπει επίσης να πούμε ότι οποιαδήποτε πράξη με το Infinity μας δίνει Infinity σαν αποτέλεσμα.



Όπως μόλις είδαμε, το Infinity είναι ένα είδος αριθμού. Όμως υπάρχει και ένα άλλος αποτέλεσμα που υπάρχει πιθανότητα να πάρουμε σαν αποτέλεσμα του typeof τελεστή και αυτό είναι το NaN (Not a Number). Παίρνουμε NaN σαν αποτέλεσμα όταν προσπαθούμε να κάνουμε αριθμητικές πράξεις αλλά η διαδικασία αποτυγχάνει όπως π.χ. όταν πολλαπλασιάζουμε τον αριθμό 10 με τον χαρακτήρα “a”.

Αν τώρα θέλουμε να γνωρίζουμε εξ αρχής ποια είναι η κατάσταση της τιμής μια μεταβλητής, μπορούμε να καλέσουμε την μέθοδο Number.isFinite( ) στην έκδοση ES6 της JavaScript ενώ με την προηγούμενη έκδοση ήταν η μέθοδος isFinite( ). Η διαφορά μεταξύ τους είναι ότι η isFinite( ) προσπαθεί να αλλάξει την τιμή της μεταβλητής που ελέγχει σε αριθμό (κάνει casting) πριν την αξιολογήσει ενώ η Number.isFinite( ) δεν κάνει μετατροπή οπότε είναι και πιο ακριβής στα αποτελέσματα που παράγει.



Πριν κλείσουμε την ενότητα ας αναφερθούμε και σε δύο ακόμα μεθόδους που μας βοηθάνε να αξιολογήσουμε την τιμή μιας μεταβλητής: Number.isNaN( ) και Number.isInteger.

Number.isNaNαξιολογεί αν η τιμή μιας μεταβλητής είναι αριθμός ή όχι χωρίς να χρειαστεί να κάνει casting πριν τον έλεγχο όπως έκανε η πιο παλιά μέθοδο isNaN( ).

Number.isIntegerεπιστρέφει true εάν ο αριθμός δεν είναι το άπειρο και δεν περιέχει δεκαδικά ψηφία δηλαδή είναι καθαρά ακέραιος.

Ας δούμε ένα παράδειγμα που χρησιμοποιεί τις πιο πάνω μεθόδους




Μιχάλης Κασάπογλου