Как мне перечислить свойства объекта JavaScript?[дубликат]
-
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"]}'
Я все еще новичок в 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;
}