Rappresentazione del dizionario di un oggetto

-3

Poiché il modello di memoria python è dizionari di dizionari, sembra che qualsiasi oggetto in JavaScript abbia una rappresentazione simile.

Sotto codice,

>
foo = {}

rende foo come dizionario vuoto {} . multa.

Se il codice dice,

> foo["bar"] = function(){
     this.ack = 3;
  };

allora foo ha l'aspetto di un dizionario come mostrato di seguito:

{"bar": function(){this.ack = 3}, "__proto__":Object}

La mia comprensione è corretta?

Sì, allora qualsiasi oggetto in JavaScript può essere consultato come object[expression] , nel mio caso l'oggetto è foo .

mdn dice anche: JavaScript is designed on a simple object-based paradigm. An object is a collection of properties, and a property is an association between a name and a value.

Se analizzo in dettaglio i dettagli di foo , la rappresentazione di foo dalla console del browser, sembra un dizionario di dizionari come mostrato di seguito (nello screenshot):

Lamiadomanda:

Riesciascriverelaformadeldizionario{}difooperlarappresentazionesopra(mostratanelloscreenshot)inquantosembradizionarididizionari?

PersupportarelamiaaffermazionecheglioggettisonodizionariinJavaScript,diseguitosonoriportatiidati.

Hoosservatoche,qualsiasicosaèmemorizzatacomeelementodeldizionario,inJavaScript:

varx="hello";
window.x["length"]
   5
var number = 2
   undefined
number["toString"]
   toString()
number["toString"]();
   "2"

PotreiscriverequalsiasicodiceinJavaScriptinterminididizionario.

varfoo="hello";
var x = foo.length;  //5
x = foo.charAt(1);    // "e"
x = "avast".charAt(3);  //"s"
//like this
window["foo"] = "hello";
    "hello"
window["x"] = window["foo"].length;
    5
window["x"]
    5
window["x"] = window["foo"].charAt(1)
    "e"
window["x"] = "avast".charAt(3);
    "s"

Nota: la chiave è sempre una stringa in Javascript. string è un tipo immutabile

    
posta overexchange 03.06.2015 - 15:38
fonte

1 risposta

3

Come puoi vedere nella console, stai guardando bar , una funzione con il corpo mostrato. All'interno di questo sono disponibili numerose proprietà sugli oggetti funzione. Se ti interessa come viene conservato foo , consulta questo articolo sull'isomorfismo del V8 e ottimizzazione della struttura .

Esaminando i documenti MDN per function , tu può vedere la stessa lista di proprietà. arguments rappresenta gli argomenti con cui è stata chiamata la funzione, caller è la funzione che ha effettuato la chiamata, length è l'arità della funzione e name è il nome proprio delle funzioni.

Dato che stai guardando l'oggetto funzione dall'esterno - a differenza di una traccia stack mentre la funzione è in esecuzione - molti di quei campi non sono compilati. Non ci sono arguments o caller a un oggetto funzione fino a quando non è stato chiamato, non sorprendentemente.

Per questo non esiste un "dizionario". Javascript ha alcuni tipi con le proprie proprietà, ereditate o istanze, che non sono semplici dizionari. Puoi definire i tuoi tipi utilizzando new e una funzione di costruzione, che si comportano con come dizionari con ereditarietà prototipica, ma non sono in realtà semplici dizionari. La rappresentazione del dizionario in Javascript è in gran parte un artefatto di vecchi runtime che potrebbe aver usato le mappe per memorizzare oggetti ed è stata mantenuta in modo da poter trattare in modo coerente diversi tipi di oggetti usando la stessa sintassi dell'array associativo per l'accesso.

Se dovessi percorrere in modo ricorsivo le chiavi enumerabili per l'oggetto che hai creato, sembrerebbe:

var foo = {
  bar: function() {
    this.ack = 3;
  }
};

function walkKeys(obj) {
  return Object.keys(obj).map(function(key) {
    return {
      key: key,
      children: walkKeys(obj[key])
    };
  });
}

var keys = walkKeys(foo);
document.getElementById('r').textContent = JSON.stringify(keys);
<pre id=r></pre>

Non si ottiene alcuna chiave per la funzione perché non ha proprietà enumerabili. Queste proprietà sono tutte del prototipo o definite per essere nascoste e la funzione non è solo un dizionario.

    
risposta data 03.06.2015 - 15:51
fonte

Leggi altre domande sui tag