vuoi
o PayPal
tutte le volte che vuoi
Least Significant bit (LSb) bit più a destra
Bit massimo è 8 (255 byte), non posso aggiungerne altri -> Overflow
Se si superano i 255 byte si usa la Rappresentazione con modulo e segno
Due problemi
2 rappresentazioni diverse per zero
Somma di due positivi è negativa se riporto sul bit di segno
Il risultato della somma può risultare sbagliato quando gli addendi sono di due segni diversi
TIPS: controllare il segno dei due numeri, se risultano diversi eseguire una sottrazione
Numeri reali
Divisione in 3 parametri
Segno
Mantissa
Esponente
Non posso rappresentare numeri né troppo grandi, né troppo piccoli (né overflow, né underflow) JS li rappresenta +/- Infinity
Basi Σ
Base 2 n2 = (che va da 0 a N-1) di*2
da base 2 a 10 moltiplico ogni cifra per 2 elevato alla 0....Σ
Base 10 n10 = (che va da 0 a N-1) di*10
da base 10 a due divido ogni cifra per 2
Rappresentazione di interi con complemento a 1
Se il numero da codificare è positivo lo
si converte in binario
Se il numero è negativo si converte in binario del suo valore assoluto e si esegue l'operazione di complementazione*2
Cambia il peso assegnato al Msb, che pesa -2^n-1
Il bit significativo uguale a 1 sta a indicare che il numero è negativo
Vantaggi – 1 solo 0 0000 0000 se faccio complemento a 2 fa 0000 0000
Nell'esecuzione della somma non devo controllare il segno
Programmazione Orientata agli Oggetti
Valori e riferimenti
Passaggio per valori
Usato per i tipi base
Contengono il valore
Assegnamento copia il valore
Uguaglianza confronta il valore
Passaggio per riferimenti
Usato per i tipi complessi
Contengono un riferimento all'area di memoria, dove viene memorizzato il valore
Uso di indirizzi di memoria
Assegnamento copia l'indirizzo
Uguaglianza confronta il riferimento
Le modifiche fatte attraverso un riferimento, sono visibili attraverso altri riferimenti allo stesso oggetto.
Usate nelle funzioni Modifica dello scope globle.
Usate nelle
strutture dati (Es: Alberi, grafi)
Vantaggi
- Oggetti semplici con comportamenti complessi, grazie ai metodi che erediteranno
- È possibile modificare individualmente i singoli oggetti per adattarli a casi speciali, senza modificare il resto degli oggetti.
- Più semplice modulizzare il codice a differenza della Programmazione Strutturata
Svantaggi
- Molto complesso costruire mentalmente la struttura degli oggetti, prototipi, funzioni e costruttori
Funzioni e metodi
- Funzioni matematiche -> funzioni pure, cioè si limitano a calcolare il risultato, senza avere effetti collaterali
- Funzioni che hanno il compito di modificare l'oggetto, solitamente associate alle proprietà
Esempio
persona.compleanno = () => {this.età++} //pippo.compleanno, incrementa l'età di pippo
Metodi
funzione come proprietà di un oggetto
Vantaggio, permette a tutti gli elementi dell'oggetto di avere un metodo, senza doverlo associare ogni volta all'elemento
invocato.New, è un operatore che ci permette di creare un nuovo oggetto e assegnare le sue proprietà e i suoi metodi all'interno del costruttore, cioè tutti gli elementi dell'oggetto hanno la stessa struttura.
Sintassi: var nome variabile = new Oggetto()
Esempio: var pippo = new Persona("Pippo", 35)
This, è un operatore che passa l'oggetto vuoto appena creato e restituisce l'oggetto inizializzato.
Esempio: function Persona (n, e) { this.nome= n; this.età = e; this.compleanno = function(){ this.età++; } }
Classi
Definizione: Una classe è un'astrazione che definisce le caratteristiche che avranno gli oggetti creati da essa. Attenzione: quando si crea una classe si deve sempre creare un costruttore, altrimenti non posso istanziare gli oggetti.
Sintassi: class nome { constructor (parametri){ this.nome parametro = parametro; } } con this manipolo l'oggetto e viene indicato l'indirizzo di.memoria
Esempio class Persona
class Persona{ constructor (nome,cognome){ this.nome = nome; this.cognome = cognome; } }
Proprietà
Possono essere dichiarate prima della creazione del constructor, compaiono nell'oggetto che sarà l'istanza della classe
Sintassi
class *nome*{ *proprietà* = ... constructor {} }
Esempio class Torta
class Torta{ Scadenza = "Maggio"; constructor (nome,...){ this.nome = nome; } }
Costruttori
Funzione adibita a creare oggetti che hanno una certa struttura. Permette di istanziare oggetti della classe. La proprietà constructor riferisce l'oggetto funzione che li ha creati.
Sintassi
constructor ( ){ ... }
Esempio class Person
class Person { constructor(Person) { this.name = Person; } }
Ereditarietà
Possono essere gerarchizzate in classi e sottoclassi -> catena dei prototipi (funzionamento sempre lo stesso) -> Ereditarietà. Possono avere dei comandi isPrototypeOf(), verificare se un certo prototipo è il prototipo di...
un oggetto hasOwnProperty()
, verifica se l'oggetto possiede o meno quella proprietà
console.dir()
, verifica di che tipo saranno gli oggetti creati con il constructor
Estendo la classe con una nuova classe, che erediterà tutto.
Meccanismo di ricerca
Overriding: una sottoclasse può ridefinire un metodo già definito in una sua superclasse (diretta o indiretta)
Una sottoclasse eredita tutti i metodi della superclasse (che non vengono ridefiniti)
Delete (sul prototipo) è anche possibile cancellare dalla sottoclasse un metodo definito dalla superclasse senza sovrascriverlo
Un'istanza può cancellare o sovrascrivere un metodo della propria classe
La parola chiave Super fa riferimento alla superclasse di un oggetto
"Evviva!"
Esempio class Studente extends Persona{ laurea() { } }
Membri Privati, metodi che non vogliono essere resi pubblici, magari usati per fare calcoli necessari per altri metodi. Visibili solo all'interno della classe,
definiti con#privateStatici
, che alludono alla proprietà statiche della classe.
Metodi di accesso
- Definizione
- Simulano la presenza di una proprietà di un oggetto, la cui scrittura e lettura causano l'esecuzione di un metodo
get
set
- Get (lettura)
- Permette di leggere il valore dell'attributo
- Sintassi
get nome(){ }
- Esempio
get km(){ return this.#distanza }
- Set (scrittura)
- Permette di impostare il valore dell'attributo
- Sintassi
set nome(){ }
- Esempio
set km(v){ this.#distanza = v }
- Lettura
- Se la chiave è presente si controlla se è un getter o una proprietà base
- Getter: si invoca la funzione corrispondente e il valore è quello restituito dalla funzione
- Proprietà base: il valore è quello della chiave dell'oggetto
- Se la chiave non è presente
prototipo è null
Memorizzo nelle celle di memoria gli indirizzi in cui si ha il prototipo precedente
Per sapere qual'è il prototipo di un oggetto posso usare o.__proto__
Esempio a=[1,2,3] a.__proto__ -> []
Object.getPrototypeOf(o)
Esempio Object.getPrototypeOf(a) -> []
Leggere il valore di una proprietà di un oggetto si osserva la chiave dell'oggetto
Se la chiave è presente, il valore è quello della chiave dell'oggetto
Se la chiave non è presente
Oggetto ha un prototipo, si cerca la proprietà nel prototipo
Oggetto non ha un prototipo, il risultato è undefined
Operazioni
Aggiungere un metodo
A un particolare oggetto, metodo disponibile solo a quell'oggetto in particolare
Al prototipo di un oggetto, metodo disponibile per tutti gli oggetti che hanno quello stesso prototipo
Prototype
Definizione Proprietà che viene inizializzata automaticamente dal linguaggio quando si dichiara la funzione Crea un legame tra
Scopo: Contenere un oggetto pronto per fare da prototipo per gli oggetti inizializzati dalla funzione Generato con le classi Generatori
Definizione: Funzioni speciali, che a differenza di eseguire tutto il codice al loro interno in un colpo solo, come in una normale funzione, ne eseguono solo una specifica parte, per poi riprendere l'esecuzione dal punto in cui era stata interrotta.
Sintassi:
function* f (parametri formali) { corpo; yield } oppure *metodo() { corpo; yield }
Il comando yield
restituisce al chiamante il valore di espressione, ma riprende l'esecuzione dal comando successivo.
Esempio:
function* range(a,b) { var i=a; while (i<b) yield i++ }
Proprietà:
Value
: valore restituito dal calcoloDone
: che risulterà false finché non ha finito tutti i passi (true quando la generazione sarà conclusa)
Metodi di invocazione:
Next()
Esempio:
var x = range (4,7) x.next() -> {value:4;done:false} x.next()
->{value:5;done:false} x.next() -> {value:6;done:false} x.next() -> {value:7;done:false}x.next() -> {value:undefined;done:true}
ForEsempio for (let i of range (4,7){ console.log(i) } // 4 5 6 7
Spread*Esempio* [...range(3,7)] ->[3,4,5,6]
Eccezioni*Definizione* Un'eccezione è un errore che si verifica a runtime dovuto ad un'operazione non consentita, che blocca l'esecuzione del programma.
Strict, modalità che genera più errori o avvertenze e quindi ci permette di avere un codice più corretto. Per attivarla -> Use strict
Gestire le eccezioni