Как мне перечислить свойства объекта JavaScript?[дубликат]

StackOverflow https://stackoverflow.com/questions/85992

  •  01-07-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Как мне перечислить свойства объекта JavaScript?

На самом деле я хочу перечислить все определенные переменные и их значения, но я узнал, что определение переменной фактически создает свойство объекта window.

Это было полезно?

Решение

Достаточно просто:

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

Теперь вы не получите закрытые переменные таким образом, потому что они недоступны.


Редактировать: @bitwiseplatypus правильно ли, что если вы не используете hasOwnProperty() таким образом, вы получите наследуемые свойства - однако я не знаю, почему кто-либо, знакомый с объектно-ориентированным программированием, ожидал чего-то меньшего!Как правило, тот, кто поднимает эту тему, был подвергнут предупреждениям Дугласа Крокфорда по этому поводу, которые до сих пор меня немного смущают.Опять же, наследование является обычной частью OO-языков и, следовательно, частью JavaScript, несмотря на то, что оно является прототипом.

Итак, это сказало, hasOwnProperty() является полезно для фильтрации, но нам не нужно выдавать предупреждение, как будто в получении унаследованных свойств есть что-то опасное.

ПРАВКА 2: @bitwiseplatypus возникает ситуация, которая могла бы возникнуть, если бы кто-то добавил свойства / методы к вашим объектам в момент времени позже, чем когда вы изначально писали свои объекты (через их прототип) - хотя это правда, что это может вызвать неожиданное поведение, я лично не рассматриваю это как свою проблему полностью.Просто вопрос мнения.Кроме того, что, если я проектирую вещи таким образом, что использую прототипы при создании своих объектов и при этом имею код, который повторяет свойства объекта, и я хочу, чтобы все унаследованные свойства?Я бы не стал использовать hasOwnProperty().Затем, допустим, кто-то позже добавит новые свойства.Разве это моя вина, если в этот момент все пойдет плохо?Я так не думаю.Я думаю, именно поэтому jQuery, в качестве примера, указал способы расширения того, как это работает (через jQuery.extend и jQuery.fn.extend).

Другие советы

Используйте for..in выполните цикл перечисления свойств объекта, но будьте осторожны.Перечисление вернет свойства не только перечисляемого объекта, но и прототипов любых родительских объектов.

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'

Чтобы избежать включения унаследованных свойств в ваше перечисление, установите флажок hasOwnProperty():

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

Редактировать: Я не согласен с утверждением JasonBunting о том, что нам не нужно беспокоиться о перечислении унаследованных свойств.Там является опасно перечислять унаследованные свойства, которых вы не ожидаете, потому что это может изменить поведение вашего кода.

Не имеет значения, существует ли эта проблема в других языках;факт в том, что он существует, и JavaScript особенно уязвим, поскольку модификации прототипа объекта влияют на дочерние объекты, даже если модификация происходит после создания экземпляра.

Вот почему JavaScript предоставляет hasOwnProperty(), и именно поэтому вы должны использовать его, чтобы гарантировать, что сторонний код (или любой другой код, который может модифицировать прототип) не нарушит ваш.Помимо добавления нескольких дополнительных байтов кода, в использовании нет никаких недостатков hasOwnProperty().

Стандартным способом, который уже предлагался несколько раз, является:

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

Однако Internet Explorer 6, 7 и 8 имеют ошибку в интерпретаторе JavaScript, которая приводит к тому, что некоторые ключи не перечисляются.Если вы запустите этот код:

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

If выдаст предупреждение "12" во всех браузерах, кроме IE.IE просто проигнорирует этот ключ.Затронутыми ключевыми значениями являются:

  • isPrototypeOf
  • hasOwnProperty
  • toLocaleString
  • toString
  • valueOf

Чтобы быть действительно безопасным в IE, вы должны использовать что-то вроде:

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]);
  }
}

Хорошей новостью является то, что ECMAScript 5 определяет Object.keys(myObject) функция, которая возвращает ключи объекта в виде массива и некоторых браузеров (напримерSafari 4) уже реализовал это.

В современных браузерах (ECMAScript 5) для получения всех перечислимых свойств вы можете сделать:

Object.ключи(obj) (Проверьте ссылку, чтобы получить фрагмент для обратной совместимости в старых браузерах)

Или получить также неперечисляемые свойства:

Object.getOwnPropertyNames(объект)

Проверьте таблицу совместимости ECMAScript 5

Дополнительная информация:Что такое перечислимый атрибут?

Я думаю, что уместен пример случая, который застал меня врасплох:

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

Но, к моему удивлению, результат таков

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

Почему?Другой скрипт на странице расширил прототип объекта:

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]);
}

Простой код JavaScript:

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
});

Я нашел это... for (property in object) { // do stuff } будет перечислен список всех свойств и, следовательно, всех глобально объявленных переменных объекта window..

Вот как перечислить свойства объекта:

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

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

Если вы используете Underscore.js библиотеку, вы можете использовать функцию ключи:

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

Вы можете использовать for из цикла.

Если вам нужен массив, используйте:

Object.keys(object1)

Ссылка. Объект.ключи()

В Python's dict есть метод 'keys', и это действительно полезно.Я думаю, что в JavaScript у нас может быть что-то подобное:

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 });

Редактировать:Но ответ @carlos-ruana работает очень хорошо.Я протестировал Object.keys (окно), и результат оказался таким, как я ожидал.

РЕДАКТИРОВАТЬ через 5 лет:расширять его - не очень хорошая идея Object, потому что это может конфликтовать с другими библиотеками , которые , возможно , захотят использовать keys на их объекты, и это приведет к непредсказуемому поведению в вашем проекте.@carlos-ruana ответ - это правильный способ получить ключи объекта.

Если вы пытаетесь перечислить свойства, чтобы написать новый код для объекта, я бы рекомендовал использовать отладчик, такой как Firebug, чтобы увидеть их визуально.

Другой удобный метод - использовать Object.toJSON() прототипа для сериализации объекта в JSON, который покажет вам как имена свойств, так и значения.

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

Я все еще новичок в JavaScript, но я написал небольшую функцию для рекурсивной печати всех свойств объекта и его дочерних элементов:

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top