Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Marco Comini
2021-10-26
JavaScript: Array/5
join( string ) costruisce una stringa con (le rappresentazioni di) tutti i
valori dell’array separandoli con string. Ad esempio
1 var a = [4 ,5.0 ,6 ,7 e8 ];
2 show ( a . join ( " + " ));
3 show ( a . join ( " " ));
produce
1 " 4+5+6+700000000 "
2 " 456700000000 "
Esempio
Ribaltiamo il contenuto di un array (senza usare il metodo reverse )
reverse([1,2,3,4]) = [4,3,2,1]
Esempio
Ribaltiamo il contenuto di un array (senza usare il metodo reverse )
1 function reverse ( a ) {
2 var i , tmp , last = a . length -1;
3
4 // show ( a );
5 for ( i =0; i <= last ; i ++) {
6 tmp = a [ i ];
7 a [ i ] = a [ last - i ];
8 a [ last - i ] = tmp ;
9 }
10 // show ( a );
11 }
Esempio
Ribaltiamo il contenuto di un array (senza usare il metodo reverse )
1 function reverse ( a ) {
2 var i , tmp , last = a . length -1;
3
4 // show ( a );
5 for ( i =0; i<last/2 ; i ++) {
6 tmp = a [ i ];
7 a [ i ] = a [ last - i ];
8 a [ last - i ] = tmp ;
9 }
10 // show ( a );
11 }
1 var m =[[]];
2
Cosa fa?
1 var m =[[]];
2
produce
1 [[0 , 0 , 0] , [1 , 1 , 1] , [2 , 2 , 2] , [3 , 3 , 3] , [4 , 4 , 4] ,
2 ... , [9 , 9 , 9]]
1 var m =[[]];
2
Cosa fa?
1 var m =[[]];
2
produce
1 [0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 3 , 3]
1 var m =[[]];
2
Cosa fa?
produce
1 [0 , 0 , 66]
2 [0 , 0 , 55]
notare che i cambi su c hanno cambiato m[0] mentre quelli su b no.
Esempio
Costruiamo la matrice identità
makeId(4) =
[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]
Esempio
Costruiamo la matrice identità
1 function makeId ( n ) {
2 var mat = [] , k ;
3
Il programma
1 function arrayMin ( array ) {
2 var min = Number . MAX_SAFE_INTEGER ;
3 // if ( array . length ==0) return undefined ;
4
1 function makeId ( n ) {
2 var mat = [];
3 mat . length = n ;
4 mat . fill (0);
5 for ( var k in mat ) {
6 mat [ k ] = [];
7 mat [ k ]. length = n ;
8 mat [ k ]. fill (0);
9 mat [ k ][ k ] = 1;
10 }
11 return mat ;
12 }
Il comando mat.fill(0); di linea 4 serve affinché il for/in faccia
effettivamente qualcosa; il valore usato è ininfluente.
RUN makeId(4)
Marco Comini Informatica Multimediale 2021-10-26 17 / 27
JavaScript: Esempi Matrici (con Array bidimensionali)/1
Esempio
Calcoliamo la somma degli elementi di una matrice di numeri
versione 1
1 function matrixSum ( a ) {
2 var sum = 0;
3 for ( var i =0; i < mat . length ; i ++)
4 for ( var j =0; j < mat [ i ]. length ; j ++)
5 sum += mat [ i ][ j ];
6 return sum ;
7 }
Esempio
Calcoliamo la somma degli elementi di una matrice di numeri
versione 2
1 function matrixSum ( a ) {
2 var sum = 0;
3 for ( var i in mat )
4 for ( var j in mat [ i ])
5 sum += mat [ i ][ j ];
6 return sum ;
7 }
Esempio
Calcoliamo la somma degli elementi di una matrice di numeri
versione 3
1 function matrixSum ( a ) {
2 var sum = 0;
3 for ( var row of mat )
4 for ( var elem of row )
5 sum += elem ;
6 return sum ;
7 }
Esempio
Calcoliamo la somma degli elementi di una matrice di numeri
ESERCIZIO per casa verificare cosa succede per matrici che contengono
elementi undefined e/o non sono ben formate (cioè con righe di lunghezza
diversa)
Esempio
Calcoliamo il vettore contenente i valori minimi delle colonne di una matrice.
a11 ... a1m
.. ..
. .
an1 . . . anm con bj = min aij
1≤i≤n
⇓
(b1 , . . . , bm )
Esempio
Calcoliamo il vettore contenente i valori minimi delle colonne di una matrice.
Esempio
Calcoliamo il vettore contenente i valori minimi delle colonne di una matrice.
JavaScript come altri linguaggi ad oggetti (tutti?) utilizza per gli oggetti il
modello a riferimenti.
Invece di avere un legame fra un identificatore e l’l-value di un oggetto, si
crea un legame con una ulteriore cella di memoria che contiene l’l-value
dell’oggetto (riferimento/puntatore all’oggetto).
Il valore di una espressione che definisce un oggetto in realtà non è l’oggetto,
ma l’indirizzo di una opportuna area di memoria in cui l’oggetto viene creato
a seconda della definizione.
Tutte le operazioni che coinvolgono oggetti quindi si comportano a tutti gli
effetti come i parametri con modalità per riferimento. Il codice
1 var point = { coordY : 2} , point2 = point ;
2 point2 . coordX = 0;
3 show ( point );
produce infatti
1 { coordY : 2 , coordX : 0}
3 function f (a , b ) {
4 a = 2; b = 5;
5 }
6
7 function g ( v ) {
8 v [2] = 40; show ( a );
9 }
10
11 var a = [1 ,2 ,3]; g ( a );
produce
1 x =0 y =0 ⇐= il cambio di a o b in f non altera x o y
2 [1 , 2 , 40] ⇐= il cambio di v in g altera a
Marco Comini Informatica Multimediale 2021-10-26 21 / 27
JavaScript: effetti dell’uso del modello a riferimenti/3
Le primitive di confronto == e != lavorano sempre sui valori degli
argomenti, quindi nel caso di oggetti confrontano i riferimenti, non gli oggetti
riferiti. Ad esempio
1 var obj1 , obj2 , obj3 ;
2
3 obj1 ={ val : 44 };
4 obj2 = obj1 ;
5 obj3 ={ val : 44 };
6
10 obj2 . val = 6;
11
Attenzione che tutte le primitive lavorano con i riferimenti (a meno che non
sia specificato espressamente che fanno delle copie)
1 var a =[];
2
3 a . length =3;
4 a . fill ({ field : 1});
5 show ( a );
6
7 a [0]. field = 3;
8 show ( a );
produce
1 [{ field : 1} , { field : 1} , { field : 1}]
2 [{ field : 3} , { field : 3} , { field : 3}]
Esempio
Scrivere una funzione isPrefixOf(str1,str2) per determinare se la stringa str2 inizia
con la stringa str1
versione 1
7 return true ;
8 }
Esempio
Scrivere una funzione isPrefixOf(str1,str2) per determinare se la stringa str2 inizia
con la stringa str1
versione 2
6 return true ;
7 }
Esempio
Scrivere una funzione isPrefixOf(str1,str2) per determinare se la stringa str2 inizia
con la stringa str1
versione 3