var obj = { name: "Simon", age: "20", clothing: { style: "simple", hipster: false } } for(var propt in obj){ console.log(propt + ': ' + obj[propt]); }
变量如何propt表示对象的属性?它不是内置的方法或属性。为什么它会产生对象中的每个属性?
propt
迭代属性需要这个额外的hasOwnProperty检查:
hasOwnProperty
for (var prop in obj) { if (Object.prototype.hasOwnProperty.call(obj, prop)) { // do stuff } }
这是必要的,因为对象的原型包含对象的附加属性,这些属性在技术上是对象的一部分。这些附加属性继承自基础对象类,但仍然是obj.
obj
hasOwnProperty只需检查这是否是特定于此类的属性,而不是从基类继承的属性。
也可以hasOwnProperty通过对象本身调用:
if (obj.hasOwnProperty(prop)) { // do stuff }
但是如果对象有一个不相关的同名字段,这将失败:
var obj = { foo: 42, hasOwnProperty: 'lol' }; obj.hasOwnProperty('foo'); // TypeError: hasOwnProperty is not a function
这就是为什么通过调用它更安全的原因Object.prototype:
Object.prototype
var obj = { foo: 42, hasOwnProperty: 'lol' }; Object.prototype.hasOwnProperty.call(obj, 'foo'); // true
从 JavaScript 1.8.5 开始,您可以使用Object.keys(obj)Array 获取在对象本身上定义的属性数组(那些返回 true 的属性obj.hasOwnProperty(key))。
Object.keys(obj)
obj.hasOwnProperty(key)
Object.keys(obj).forEach(function(key,index) { // key: the name of the object key // index: the ordinal position of the key within the object });
这比使用 for-in 循环更好(并且更具可读性)。
它在这些浏览器上受支持: