Vincoli JavaScript sui valori dell'oggetto

1

Sto leggendo letteralmente il libro JavaScript: The Good Parts di Douglas Crockford .

L'apertura del capitolo 3% diObjects mi confonde immediatamente con una (possibile) contraddizione. Ho riletto i due paragrafi almeno una dozzina di volte e ancora non sono sicuro di quale parte sia corretta e quale sia errata.

Cercherò sicuramente di provare le cose nella console del browser, ma non voglio perdere un dettaglio importante nel caso in cui non ci siano errori o contraddizioni nel libro. Qualcuno potrebbe chiarirmi questo?

An object is a container of properties, where a property has a name and a value. ... A property value can be any JavaScript value except for undefined.

... There is no constraint on the names of new properties or on the values of properties.

    
posta Igor Soloydenko 06.10.2017 - 19:10
fonte

2 risposte

3

Non ho la mia copia del libro a portata di mano, ma undefined è valida per entrambi i nomi e i valori delle proprietà. È abbastanza semplice da demo in una console del browser.

var obj = {
    foo: undefined
};
obj.bar = undefined;
obj[undefined] = undefined;

obj.hasOwnProperty("foo");  // === true
obj.propertyIsEnumerable("bar");  // === true
obj.propertyIsEnumerable(undefined);  // === true

Il sito Web O'Reilly conserva elenchi di confermati e unconfirmed errata. Se ritieni che il libro sia errato, puoi inviare i tuoi errata.

    
risposta data 06.10.2017 - 19:25
fonte
1

Ciò che sta realmente dicendo, senza venire fuori e dirlo, è Gli oggetti JavaScript sono solo coppie chiave-valore.

In Java, sarebbe un HashTable<String, Object>

In C # sarebbe un Dictionary<string, object> .

Gli oggetti JavaScript sono solo un sacchetto di chiavi come stringhe e i valori associati a ogni chiave di qualsiasi tipo che esiste in JavaScript.

var x = {
    foo: false
};

Puoi accedere al valore della proprietà foo o significa:

x.foo
x["foo"]

Inoltre, puoi usare qualsiasi carattere di stringa valido per un nome di proprietà se usi la notazione dell'array:

x["@%$!$5@^^"] = 8;

Questa notazione di matrice imita la sintassi di accesso o impostazione dei valori su un oggetto Dizionario in C #:

Dictionary<string, object> x = new Dictionary<string, object>();

x["foo"] = false;
x["@%$!$5@^^"] = 8;

Di qui l'associazione che Douglas Crockford sta facendo con gli oggetti JavaScript come "un contenitore di proprietà, in cui una proprietà ha un nome e un valore".

L'ultima cosa che potrebbe non aver scritto (o che non hai ancora letto) è che i nomi delle proprietà in JavaScript sono sempre convertiti in stringhe:

x[undefined] = 4;
x["undefined"] = 9;

Screenshot dagli strumenti di debug di Firefox:

    
risposta data 06.10.2017 - 19:24
fonte

Leggi altre domande sui tag