Domanda

Questa domanda ha già una risposta qui:

Come posso enumerare le proprietà di un oggetto JavaScript?

In realtà vorrei elencare tutte le variabili definite e i relativi valori, ma ho imparato che la definizione di una variabile crea in realtà una proprietà dell'oggetto finestra.

È stato utile?

Soluzione

Abbastanza semplice:

for(var propertyName in myObject) {
   // propertyName is what you want
   // you can get the value like this: myObject[propertyName]
}

Ora, non otterrai variabili private in questo modo perché non sono disponibili.


MODIFICARE: @bitwiseplatypus è corretto, a meno che non si utilizzi il file hasOwnProperty() metodo, otterrai proprietà ereditate, tuttavia, non so perché chiunque abbia familiarità con la programmazione orientata agli oggetti si aspetterebbe qualcosa di meno!Di solito, qualcuno che solleva questo argomento è stato sottoposto agli avvertimenti di Douglas Crockford a riguardo, il che mi confonde ancora un po'.Ancora una volta, l'ereditarietà è una parte normale dei linguaggi OO e quindi fa parte di JavaScript, nonostante sia un prototipo.

Ora, detto questo, hasOwnProperty() È utile per il filtraggio, ma non è necessario dare un avvertimento come se ci fosse qualcosa di pericoloso nell'ottenere proprietà ereditate.

MODIFICA 2: @bitwiseplatypus fa apparire la situazione che si verificherebbe se qualcuno aggiungesse proprietà/metodi ai tuoi oggetti in un momento successivo rispetto a quando hai originariamente scritto i tuoi oggetti (tramite il suo prototipo) - sebbene sia vero che ciò potrebbe causare un comportamento inaspettato, personalmente non lo faccio Non lo vedo interamente come un mio problema.Solo una questione di opinioni.Inoltre, cosa succede se progetto le cose in modo tale da utilizzare prototipi durante la costruzione dei miei oggetti e tuttavia avere un codice che esegue un'iterazione sulle proprietà dell'oggetto e voglio che tutte le proprietà siano ereditate?Non lo userei hasOwnProperty().Quindi, diciamo, qualcuno aggiunge nuove proprietà in seguito.È colpa mia se a quel punto le cose si comportano male?Non credo.Penso che questo sia il motivo per cui jQuery, ad esempio, ha specificato i modi per estendere il suo funzionamento (via jQuery.extend E jQuery.fn.extend).

Altri suggerimenti

Usare un for..in loop per enumerare le proprietà di un oggetto, ma fai attenzione.L'enumerazione restituirà le proprietà non solo dell'oggetto da enumerare, ma anche dei prototipi di eventuali oggetti principali.

var myObject = {foo: 'bar'};

for (var name in myObject) {
  alert(name);
}

// results in a single alert of 'foo'

Object.prototype.baz = 'quux';

for (var name in myObject) {
  alert(name);
}

// results in two alerts, one for 'foo' and one for 'baz'

Per evitare di includere proprietà ereditate nell'enumerazione, controlla hasOwnProperty():

for (var name in myObject) {
  if (myObject.hasOwnProperty(name)) {
    alert(name);
  }
}

Modificare: Non sono d'accordo con l'affermazione di JasonBunting secondo cui non dobbiamo preoccuparci di enumerare le proprietà ereditate.Là È pericolo nell'enumerare proprietà ereditate che non ti aspetti, perché può modificare il comportamento del tuo codice.

Non importa se questo problema esiste in altre lingue;il fatto è che esiste e JavaScript è particolarmente vulnerabile poiché le modifiche al prototipo di un oggetto influenzano gli oggetti figli anche se la modifica avviene dopo l'istanziazione.

Questo è il motivo per cui JavaScript fornisce hasOwnProperty(), ed è per questo che dovresti usarlo per assicurarti che il codice di terze parti (o qualsiasi altro codice che potrebbe modificare un prototipo) non danneggi il tuo.A parte l'aggiunta di qualche byte di codice in più, non ci sono svantaggi nell'usarlo hasOwnProperty().

Il metodo standard, già proposto più volte, è:

for (var name in myObject) {
  alert(name);
}

Tuttavia Internet Explorer 6, 7 e 8 presentano un bug nell'interprete JavaScript che fa sì che alcune chiavi non vengano enumerate.Se esegui questo codice:

var obj = { toString: 12};
for (var name in obj) {
  alert(name);
}

Se avviserà "12" in tutti i browser tranne IE.IE ignorerà semplicemente questa chiave.I valori chiave interessati sono:

  • isPrototypeOf
  • hasOwnProperty
  • toLocaleString
  • toString
  • valueOf

Per essere veramente sicuro in IE devi usare qualcosa come:

for (var key in myObject) {
  alert(key);
}

var shadowedKeys = [
  "isPrototypeOf",
  "hasOwnProperty",
  "toLocaleString",
  "toString",
  "valueOf"
];
for (var i=0, a=shadowedKeys, l=a.length; i<l; i++) {
  if map.hasOwnProperty(a[i])) {
    alert(a[i]);
  }
}

La buona notizia è che EcmaScript 5 definisce il Object.keys(myObject) funzione, che restituisce le chiavi di un oggetto come array e alcuni browser (ad es.Safari 4) lo implementano già.

Nei browser moderni (ECMAScript 5) per ottenere tutte le proprietà enumerabili puoi fare:

Object.keys(oggetto)(Controlla il collegamento per ottenere uno snippet per la compatibilità con le versioni precedenti sui browser meno recenti)

Oppure per ottenere anche proprietà non enumerabili:

Object.getOwnPropertyNames(obj)

Controlla la tabella di compatibilità ECMAScript 5

Informazioni addizionali:Cos'è un attributo enumerabile?

Penso che un esempio del caso che mi ha colto di sorpresa sia rilevante:

var myObject = { name: "Cody", status: "Surprised" };
for (var propertyName in myObject) {
  document.writeln( propertyName + " : " + myObject[propertyName] );
}

Ma con mia sorpresa, il risultato è

name : Cody
status : Surprised
forEach : function (obj, callback) {
    for (prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") {
            callback(prop);
        }
    }
}

Perché?Un altro script nella pagina ha esteso il prototipo dell'oggetto:

Object.prototype.forEach = function (obj, callback) {
  for ( prop in obj ) {
    if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) {
      callback( prop );
    }
  }
};
for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}

Codice JavaScript semplice:

for(var propertyName in myObject) {
   // propertyName is what you want.
   // You can get the value like this: myObject[propertyName]
}

jQuery:

jQuery.each(obj, function(key, value) {
   // key is what you want.
   // The value is in: value
});

L'ho trovato... for (property in object) { // do stuff } elencherà tutte le proprietà, e quindi tutte le variabili dichiarate globalmente sull'oggetto finestra..

Ecco come enumerare le proprietà di un oggetto:

var params = { name: 'myname', age: 'myage' }

for (var key in params) {
  alert(key + "=" + params[key]);
}

Se stai utilizzando il Sottolineato.js libreria, puoi usare la funzione chiavi:

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]

Puoi usare il for di ciclo.

Se vuoi un array usa:

Object.keys(object1)

Rif. Object.keys()

Il dict di Python ha il metodo "chiavi" e questo è davvero utile.Penso che in JavaScript possiamo avere qualcosa di questo:

function keys(){
    var k = [];
    for(var p in this) {
        if(this.hasOwnProperty(p))
            k.push(p);
    }
    return k;
}
Object.defineProperty(Object.prototype, "keys", { value : keys, enumerable:false });

MODIFICARE:Ma la risposta di @carlos-ruana funziona molto bene.Ho testato Object.keys(window) e il risultato è quello che mi aspettavo.

EDIT dopo 5 anni:non è una buona idea estendere Object, perché può entrare in conflitto con altre librerie che potrebbero voler utilizzare keys sui loro oggetti e porterà un comportamento imprevedibile sul tuo progetto.La risposta @ carlos-ruana è il modo corretto per ottenere le chiavi di un oggetto.

Se stai provando a enumerare le proprietà per scrivere nuovo codice sull'oggetto, ti consiglio di utilizzare un debugger come Firebug per vederle visivamente.

Un'altra tecnica utile consiste nell'utilizzare Object.toJSON() di Prototype per serializzare l'oggetto in JSON, che mostrerà sia i nomi che i valori delle proprietà.

var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
Object.toJSON(data);
//-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}'

http://www.prototypejs.org/api/object/tojson

Sono ancora un principiante in JavaScript, ma ho scritto una piccola funzione per stampare ricorsivamente tutte le proprietà di un oggetto e dei suoi figli:

getDescription(object, tabs) {
  var str = "{\n";
  for (var x in object) {
      str += Array(tabs + 2).join("\t") + x + ": ";
      if (typeof object[x] === 'object' && object[x]) {
        str += this.getDescription(object[x], tabs + 1);
      } else {
        str += object[x];
      }
      str += "\n";
  }
  str += Array(tabs + 1).join("\t") + "}";
  return str;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top