如果我不知道名称,如何访问JavaScript对象的属性?

假设你有这样一个javascript对象:

var data = { foo: 'bar', baz: 'quux' }; 

您可以通过属性名称访问属性:

 var foo = data.foo; var baz = data["baz"]; 

但是如果你不知道这些属性的名字,有可能得到这些值吗? 这些属性的无序性使得不可能将它们区分开来吗?

在我的情况下,我特别想到一个函数需要接受一系列名称 – 值对的情况,但属性的名称可能会改变。

到目前为止,我对如何做到这一点的想法是将属性的名称和数据一起传递给函数,但是这感觉就像是一个黑客。 如果可能的话,我宁愿用自省来做这件事。

你可以像这样循环键:

 for (var key in data) { console.log(key); } 

这会logging“名称”和“值”。

如果你有一个更复杂的对象types(不像原始问题那样只是一个简单的散列对象),你只需要遍历属于对象本身的键,而不是对象原型的键:

 for (var key in data) { if (data.hasOwnProperty(key)) { console.log(key); } } 

正如你所指出的,钥匙不保证以任何特定的顺序。 请注意这与以下内容有什么不同:

 for each (var value in data) { console.log(value); } 

此示例循环访问值,因此它将logging“ Property Name和“ 0 。 注意: for each语法大多只在Firefox中支持,而在其他浏览器中则不支持。

如果您的目标浏览器支持ES5,或者您的站点包含es5-shim.js (推荐),则还可以使用Object.keys

 var data = { Name: 'Property Name', Value: '0' }; console.log(Object.keys(data)); // => ["Name", "Value"] 

并与Array.prototype.forEach循环:

 Object.keys(data).forEach(function (key) { console.log(data[key]); }); // => Logs "Property Name", 0 

旧版本的JavaScript(<ES5)需要使用for..in循环:

 for (var key in data) { if (data.hasOwnProperty(key)) { // do something with key } } 

ES5引入了Object.keys和Array#forEach ,这使得它更容易一些:

 var data = { foo: 'bar', baz: 'quux' }; Object.keys(data); // ['foo', 'baz'] Object.keys(data).map(function(key){ return data[key] }) // ['bar', 'quux'] Object.keys(data).forEach(function (key) { // do something with data[key] }); 

ES2017引入了Object.valuesObject.entries

 Object.values(data) // ['bar', 'quux'] Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']] 
 for(var property in data) { alert(property); } 

您经常需要检查对象实例的特定属性,而不需要共享原型方法和属性:

  Obj.prototype.toString= function(){ var A= []; for(var p in this){ if(this.hasOwnProperty(p)){ A[A.length]= p+'='+this[p]; } } return A.join(', '); } 
 function getDetailedObject(inputObject) { var detailedObject = {}, properties; do { properties = Object.getOwnPropertyNames( inputObject ); for (var o in properties) { detailedObject[properties[o]] = inputObject[properties[o]]; } } while ( inputObject = Object.getPrototypeOf( inputObject ) ); return detailedObject; } 

这将获得一个新对象的所有属性和它们的值(inheritance或拥有,可枚举或不)。 原始的对象是不变的。 现在可以使用新的对象

 var obj = { 'b': '4' }; //example object var detailedObject = getDetailedObject(obj); for(var o in detailedObject) { console.log('key: ' + o + ' value: ' + detailedObject[o]); } 
 var fs = require("fs"); fs.stat( process.argv[1], function( err, stats ){ if (err) { console.log( err.message ); return; } else { console.log(JSON.stringify(stats)); /* this is the answer here */ for (var key in Object.keys(stats)){ var t = Object.keys( stats )[key]; console.log( t + " value =: " + stats[t] ); } /* to here, run in node */ } }); 
 var attr, object_information=''; for(attr in object){ //Get names and values of propertys with style (name : value) object_information += attr + ' : ' + object[attr] + '\n'; } alert(object_information); //Show all Object