window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = finestra if (w.LeadBooster) { console.warn('LeadBooster esiste già') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() La potenza degli oggetti JavaScript - The Codest
The Codest
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Industrie
    • Fintech e banche
    • E-commerce
    • Adtech
    • Tecnologia della salute
    • Produzione
    • Logistica
    • Automotive
    • IOT
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
  • Chi siamo
  • Servizi
    • Sviluppo di software
      • Sviluppo Frontend
      • Sviluppo backend
    • Staff Augmentation
      • Sviluppatori Frontend
      • Sviluppatori backend
      • Ingegneri dei dati
      • Ingegneri del cloud
      • Ingegneri QA
      • Altro
    • Consulenza
      • Audit e consulenza
  • Valore per
    • CEO
    • CTO
    • Responsabile della consegna
  • Il nostro team
  • Case Studies
  • Sapere come
    • Blog
    • Incontri
    • Webinar
    • Risorse
Carriera Contattate
Freccia indietro TORNA INDIETRO
2020-10-13
Sviluppo di software

La potenza degli oggetti JavaScript

The Codest

Bartosz Slysz

Software Engineer

Gli ultimi anni ci hanno dimostrato che lo sviluppo web sta cambiando. Con l'aggiunta di molte funzionalità e API ai browser, abbiamo dovuto utilizzarle nel modo giusto. Il linguaggio a cui dobbiamo questo onore è stato JavaScript.

Inizialmente, gli sviluppatori non erano convinti di come era stato progettato e hanno avuto impressioni per lo più negative durante l'utilizzo di questo script. Col tempo, si è scoperto che questo linguaggio ha un grande potenziale e i successivi standard ECMAScript rendono alcune meccaniche più umane e, semplicemente, migliori. In questo articolo ne esaminiamo alcuni.

Tipi di valori in JS

La ben nota verità su JavaScript è che qui tutto è un oggetto. Davvero, tutto: array, funzioni, stringhe, numeri e persino booleani. Tutti i tipi di valori sono rappresentati da oggetti e hanno i loro metodi e campi. Tuttavia, possiamo dividerli in due categorie: primitivi e strutturali. I valori della prima categoria sono immutabili, il che significa che possiamo riassegnare una variabile con il nuovo valore, ma non possiamo modificare il valore esistente. La seconda rappresenta valori che possono essere modificati, quindi devono essere interpretati come collezioni di proprietà che possiamo sostituire o semplicemente chiamare i metodi che sono progettati per farlo. 

Ambito di applicazione delle variabili dichiarate

Prima di approfondire, spieghiamo il significato di scope. Possiamo dire che l'ambito è l'unica area in cui possiamo utilizzare le variabili dichiarate. Prima dello standard ES6, potevamo dichiarare le variabili con l'istruzione var e assegnare loro un ambito globale o locale. Il primo è un ambito che ci permette di accedere ad alcune variabili in qualsiasi punto dell'applicazione, il secondo è dedicato a un'area specifica, principalmente una funzione.

Dal momento che lo standard ES2015, JavaScript ha tre modi per dichiarare le variabili, che differiscono per la parola chiave. Il primo è già stato descritto in precedenza: le variabili dichiarate con la parola chiave var hanno lo scope del corpo della funzione corrente. Lo standard ES6 ci ha permesso di dichiarare le variabili con modalità più umane: al contrario delle dichiarazioni var, le variabili dichiarate con le dichiarazioni const e let hanno uno scope solo sul blocco. Tuttavia, JS tratta l'istruzione const in modo piuttosto insolito, se confrontata con altre dichiarazioni linguaggi di programmazione - invece di un valore persistente, mantiene un riferimento persistente al valore. In breve, possiamo modificare le proprietà di un oggetto dichiarato con un'istruzione const, ma non possiamo sovrascrivere il riferimento a questa variabile. Alcuni sostengono che l'alternativa var in ES6 sia in realtà l'istruzione let. No, non è così, e l'istruzione var non è e probabilmente non sarà mai ritirata. Una buona pratica è quella di evitare l'uso di dichiarazioni var, perché nella maggior parte dei casi ci danno più problemi. A sua volta, dobbiamo abusare delle dichiarazioni const, fino a quando non dobbiamo modificare il suo riferimento - allora dovremmo usare let. 

Esempio di comportamento inatteso dell'ambito

Cominciamo con quanto segue codice: 

(() => {
 for (var i = 0; i  {
      console.log(`Valore di "i": ${i}`);
    }, 1000);
  }
})();

Se lo guardiamo, sembra che il ciclo for iteri il valore i e, dopo un secondo, registri i valori dell'iteratore: 1, 2, 3, 4, 5. Ma non è così. Come abbiamo detto sopra, l'istruzione var serve a mantenere il valore di una variabile per tutto il corpo della funzione; ciò significa che alla seconda, terza e così via iterazione il valore della variabile i verrà sostituito con un valore successivo. Infine, il ciclo termina e i ticchettii del timeout ci mostrano la seguente situazione: 5, 5, 5, 5, 5, 5. Il modo migliore per mantenere il valore corrente dell'iteratore è utilizzare l'istruzione let:

(() => {
 for (let i = 0; i  {
      console.log(`Valore di "i": ${i}`);
    }, 1000);
  }
})();

Nell'esempio precedente, manteniamo l'ambito del valore i nel blocco di iterazione corrente; è l'unico ambito in cui possiamo usare questa variabile e nulla può sovrascriverla al di fuori di questo ambito. In questo caso, il risultato è quello atteso: 1 2 3 4 5. Vediamo come gestire questa situazione con una dichiarazione var: 

(() => {
 for (var i = 0; i  {
      setTimeout(() => {
        console.log(`Valore di "j": ${j}`);
      }, 1000);
    })(i);
  }
})();

Poiché l'istruzione var serve a mantenere il valore all'interno del blocco funzione, dobbiamo chiamare una funzione definita che accetta un argomento - il valore dello stato corrente dell'iteratore - e poi fare qualcosa. Nulla al di fuori della funzione dichiarata potrà sovrascrivere il valore di j. 

Esempi di aspettative errate sui valori degli oggetti

Il crimine più frequente che ho notato riguarda l'ignorare il potere delle strutture e il cambiare le loro proprietà che vengono modificate anche in altri pezzi di codice. Date un'occhiata veloce: 

const DEFAULT_VALUE = {
  favoriteBand: 'The Weeknd'
};
const currentValue = DEFAULT_VALUE;
const bandInput = document.querySelector('#favorite-band');
const restoreDefaultButton = document.querySelector('#restore-button');
bandInput.addEventListener('input', () => {
  currentValue.favoriteBand = bandInput.value;
}, false);
restoreDefaultButton.addEventListener('click', () => {
  currentValue = DEFAULT_VALUE;
}, false);

Dall'inizio: supponiamo di avere un modello con proprietà predefinite, memorizzate come oggetto. Vogliamo avere un pulsante che ripristini i valori di input a quelli predefiniti. Dopo aver riempito l'input con alcuni valori, aggiorniamo il modello. Dopo un attimo, pensiamo che la scelta predefinita fosse semplicemente migliore, quindi vogliamo ripristinarla. Facciamo clic sul pulsante... e non succede nulla. Perché? Perché ignoriamo il potere dei valori di riferimento. 

Questa parte: const currentValue = DEFAULTVALUE sta dicendo al JS quanto segue: prendere il riferimento al DEFAULTVALUE e assegnare la variabile currentValue. Il valore reale viene memorizzato una sola volta ed entrambe le variabili puntano ad esso. Modificare alcune proprietà in un punto significa modificarle in un altro. Esistono alcuni modi per evitare situazioni di questo tipo. Uno che soddisfa le nostre esigenze è l'operatore spread. Correggiamo il nostro codice:

const DEFAULT_VALUE = {
  favoriteBand: 'The Weeknd'
};
const currentValue = { ...DEFAULT_VALUE };
const bandInput = document.querySelector('#favorite-band');
const restoreDefaultButton = document.querySelector('#restore-button');
bandInput.addEventListener('input', () => {
  currentValue.favoriteBand = bandInput.value;
}, false);
restoreDefaultButton.addEventListener('click', () => {
  currentValue = { ...DEFAULT_VALUE };
}, false);

In questo caso, l'operatore spread funziona in questo modo: prende tutte le proprietà di un oggetto e crea un nuovo oggetto riempito con esse. In questo modo, i valori in currentValue e DEFAULT_VALUE non puntano più allo stesso punto della memoria e tutte le modifiche applicate a uno di essi non influenzeranno gli altri. 

Ok, quindi la domanda è: si tratta solo di usare il magico operatore di spread? In questo caso sì, ma i nostri modelli potrebbero richiedere una maggiore complessità rispetto a questo esempio. Nel caso in cui si utilizzino oggetti annidati, array o qualsiasi altra struttura, l'operatore spread del valore referenziato di primo livello avrà effetto solo sul livello superiore e le proprietà referenziate continueranno a condividere lo stesso posto in memoria. Ci sono molte soluzioni per gestire questo problema, tutto dipende dalle vostre esigenze. Possiamo clonare gli oggetti a ogni livello di profondità o, per operazioni più complesse, utilizzare strumenti come immer, che ci permettono di scrivere codice immutabile in modo quasi indolore.

Mescolare il tutto

È possibile utilizzare un mix di conoscenze sugli ambiti e sui tipi di valori? Certo che sì! Costruiamo qualcosa che li utilizzi entrambi: 

 const useValue = (defaultValue) => {
 const value = [...defaultValue];
 const setValue = (newValue) => {
    value.length = 0; // un modo complicato per cancellare l'array
    newValue.forEach((item, index) => {
      valore[indice] = elemento;
    });
 // fare altre cose
  };

 restituire [valore, setValue];
};
const [animali, setAnimali] = useValue(['gatto', 'cane']);
console.log(animals); // ['gatto', 'cane']
setAnimals(['cavallo', 'mucca']);
console.log(animals); // ['cavallo', 'mucca']);

Spieghiamo come funziona questo codice riga per riga. La funzione useValue crea un array basato sull'argomento defaultValue; crea una variabile e un'altra funzione, il suo modificatore. Questo modificatore prende un nuovo valore che viene applicato in modo complicato a quello esistente. Al termine della funzione, restituiamo il valore e il suo modificatore come valori dell'array. Successivamente, utilizziamo la funzione creata: dichiariamo animals e setAnimals come valori restituiti. Utilizziamo il loro modificatore per verificare se la funzione influisce sulla variabile animale: sì, funziona! 

Ma aspettate, cosa c'è esattamente di così sofisticato in questo codice? Il riferimento mantiene tutti i nuovi valori e si può iniettare la propria logica in questo modificatore, come ad esempio alcune API o una parte dell'ecosistema che alimenta il flusso di dati senza alcuno sforzo. Questo schema complicato è spesso usato nelle librerie JS più moderne, dove il paradigma funzionale della programmazione ci permette di mantenere il codice meno complesso e più facile da leggere per gli altri programmatori. 

Sintesi

La comprensione di come funzionano le meccaniche del linguaggio sotto il cofano ci permette di scrivere codice più consapevole e leggero. Anche se JS non è un linguaggio di basso livello e ci obbliga ad avere una certa conoscenza di come viene assegnata e memorizzata la memoria, dobbiamo comunque tenere d'occhio i comportamenti inaspettati quando modifichiamo gli oggetti. D'altra parte, abusare dei cloni di valori non è sempre la strada giusta e un uso scorretto ha più svantaggi che vantaggi. Il modo giusto di pianificare il flusso di dati è considerare ciò di cui si ha bisogno e i possibili ostacoli che si possono incontrare quando si implementa la logica dell'applicazione.

Per saperne di più:

  • Come migliorare le applicazioni Vue.js? Alcuni consigli pratici
  • Caratteristiche dell'Vuex da conoscere se si ha davvero a cuore il proprio negozio
  • Come scrivere un codice di qualità?

Articoli correlati

Sviluppo di software

Costruire applicazioni web a prova di futuro: le intuizioni del team di esperti di The Codest

Scoprite come The Codest eccelle nella creazione di applicazioni web scalabili e interattive con tecnologie all'avanguardia, offrendo esperienze utente senza soluzione di continuità su tutte le piattaforme. Scoprite come la nostra esperienza favorisce la trasformazione digitale e il business...

IL CANCRO
Sviluppo di software

Le 10 principali aziende di sviluppo software con sede in Lettonia

Scoprite le migliori aziende di sviluppo software della Lettonia e le loro soluzioni innovative nel nostro ultimo articolo. Scoprite come questi leader tecnologici possono aiutarvi a migliorare la vostra attività.

thecodest
Soluzioni per aziende e scaleup

Essenziali di sviluppo software Java: Guida all'outsourcing di successo

Esplorate questa guida essenziale sullo sviluppo di software Java con successo outsourcing per migliorare l'efficienza, accedere alle competenze e guidare il successo del progetto con The Codest.

thecodest
Sviluppo di software

La guida definitiva all'outsourcing in Polonia

L'aumento di outsourcing in Polonia è guidato dai progressi economici, educativi e tecnologici, che favoriscono la crescita dell'IT e un clima favorevole alle imprese.

IlCodesto
Soluzioni per aziende e scaleup

Guida completa agli strumenti e alle tecniche di audit IT

Gli audit IT garantiscono sistemi sicuri, efficienti e conformi. Per saperne di più sulla loro importanza, leggete l'articolo completo.

The Codest
Jakub Jakubowicz CTO e cofondatore

Iscrivetevi alla nostra knowledge base e rimanete aggiornati sulle competenze del settore IT.

    Chi siamo

    The Codest - Società internazionale di sviluppo software con centri tecnologici in Polonia.

    Regno Unito - Sede centrale

    • Ufficio 303B, 182-184 High Street North E6 2JA
      Londra, Inghilterra

    Polonia - Poli tecnologici locali

    • Parco uffici Fabryczna, Aleja
      Pokoju 18, 31-564 Cracovia
    • Ambasciata del cervello, Konstruktorska
      11, 02-673 Varsavia, Polonia

      The Codest

    • Casa
    • Chi siamo
    • Servizi
    • Case Studies
    • Sapere come
    • Carriera
    • Dizionario

      Servizi

    • Consulenza
    • Sviluppo di software
    • Sviluppo backend
    • Sviluppo Frontend
    • Staff Augmentation
    • Sviluppatori backend
    • Ingegneri del cloud
    • Ingegneri dei dati
    • Altro
    • Ingegneri QA

      Risorse

    • Fatti e miti sulla collaborazione con un partner esterno per lo sviluppo di software
    • Dagli Stati Uniti all'Europa: Perché le startup americane decidono di trasferirsi in Europa
    • Confronto tra gli hub di sviluppo Tech Offshore: Tech Offshore Europa (Polonia), ASEAN (Filippine), Eurasia (Turchia)
    • Quali sono le principali sfide di CTO e CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Condizioni di utilizzo del sito web

    Copyright © 2025 di The Codest. Tutti i diritti riservati.

    it_ITItalian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek it_ITItalian