Oggetti

Gli oggetti sono un tipo di dati discreto, così come ogni primitivo è un tipo di dati, con un elemento critico Differenza: a differenza delle primitive, gli oggetti sono mutabili. Un oggetto può contenere dati associata a identificatori, come una variabile, ma conserva i suoi dati object a prescindere dai dati che contiene.

A parte le primitive, tutti i valori JavaScript sono oggetti, anche se i valori letterali primitivi mostrano un comportamento simile a un oggetto a causa ereditarietà prototipale, spesso detto che JavaScript è composto da oggetti.

Un valore letterale oggetto è una coppia di parentesi graffe che circondano zero o più coppie chiave-valore coppie chiamate "proprietà", che può contenere qualsiasi valore JavaScript.

{
    "myProperty" : true
}

Le chiavi della proprietà possono essere qualsiasi simbolo o stringa. Ad esempio, per l'assegnazione di un identificatore a una variabile, le stringhe utilizzate come chiavi di proprietà devono essere prevedibili descrittivo:

let carAttributes = {
    "color" : "red"
};

carAttributes
> Object { color: "red" }

Le chiavi proprietà richiedono un valore letterale di stringa singola (') o tra virgolette doppie ("), non un valore letterale modello:

let carAttributes = {
    `keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal

I valori delle proprietà possono essere di qualsiasi tipo. Le proprietà di un oggetto possono contengono oggetti con le loro proprietà:

let myObject = {
    'key' : {
        'subkey' : true,
        'othersubkey' : false
    }
};

myObject;
> Object { key: Object { subkey: true, othersubkey: false } }

Quando il valore di una proprietà è una funzione, questa proprietà è chiamata "metodo".

const myObject = {
    "myProperty" : true,
    myMethod() {
        console.log( "This is a method." );
    }
}

myObject.myProperty;
> true

myObject.myMethod();
> "This is a method."

Puoi anche creare un oggetto utilizzando la parola chiave new:

let myObject = new Object();

Negli esempi precedenti, i valori letterali oggetto appena creati sono stati assegnati alle variabili. Non è obbligatorio perché, come per qualsiasi altro tipo di dati, puoi utilizzare un oggetto senza identificatore ovunque sia previsto un oggetto. Tuttavia, un il valore letterale oggetto richiede le parentesi in qualsiasi contesto in cui potrebbe essere confuso per un'istruzione di blocco, dato che le due condividono la sintassi delle parentesi graffe ({}). Non è mai necessario inizializzare una variabile.

{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'

({ "value" : 2 })
> Object { value: 2 }

let valObj = { "value" : 2 };

valObj;
> Object { value: 2 }

A differenza delle primitive, non c'è alcuna differenza significativa nei risultati della creazione un oggetto utilizzando new Object() e la creazione di un valore letterale oggetto, perché il risultato sarà in entrambi i casi un oggetto con proprietà ereditate dal Object prototipo. Esiste però una differenza pratica tra i due sintattico.

La parola chiave new deve definire un oggetto vuoto che verrà riempito con dati in un secondo momento:

let myObject = new Object();

myObject.booleanValue = true;
myObject.stringValue = "My string.";

Un valore letterale oggetto può essere compilato con i dati al momento della creazione:

let myObject = {
    'booleanValue' : true,
    'stringValue' : "My string."
};

Sebbene abbia poco impiego pratico, new Object() può essere usato per trasformare gli oggetti i valori dei dati in oggetti del rispettivo tipo, come quelli restituiti utilizzando la parola chiave new insieme al relativo costruttore personalizzata. Ad esempio, quanto segue è funzionalmente equivalente a new Number( 10 ):

let myObject = new Object( 10 );

myObject;
> Number { 10 }

I valori null e undefined generano un oggetto vuoto, funzionalmente identico a richiamare new Object() senza fornire un argomento.

Il passaggio di un oggetto letterale a new Object() come argomento consente di passare l'oggetto senza modificarlo:

let myObject = new Object( { myValue : 10 } );

myObject;
> Object { myValue: 10 }

Come per i costruttori per i valori primitivi, l'uso dei costruttori per gli oggetti raramente ha vantaggi rispetto all'uso della notazione letterale oggetto. Anche durante la creazione vuoti da completare con i valori in un secondo momento, gli sviluppatori tendono a prediligere notazione letterale per semplicità.

Verifica le tue conoscenze

Che tipi di notazione puoi utilizzare per impostare le proprietà di un oggetto?

Notazione con punto
Notazione parentesi quadra
Notazione del periodo
Notazione a linee

Quale delle seguenti è la sintassi corretta per ottenere il valore di myProp

myObj["myProp"];
myObj{"myProp"};
myObj("myProp");