var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
变量如何propt
表示对象的属性?它不是内置方法或属性。为什么它提出了对象中的每个属性?
var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
变量如何propt
表示对象的属性?它不是内置方法或属性。为什么它提出了对象中的每个属性?
迭代属性需要这个额外的hasOwnProperty
检查:
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
// do stuff
}
}
这是必要的,因为对象的原型包含对象的附加属性,这些属性在技术上是对象的一部分。这些附加属性是从基对象类继承的,但仍然是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
:
var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo'); // true
从 JavaScript 1.8.5 开始,您可以使用Object.keys(obj)
来获取在对象本身上定义的属性数组(为 返回 true 的属性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 循环更好(也更易读)。
它在这些浏览器上受支持:
有关更多信息,请参阅Mozilla 开发人员网络Object.keys()的参考。
小伙子们,我们在 2019 年,我们没有那么多时间打字……所以让我们来做一个很酷的新奇幻 ECMAScript 2016:
Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
这是for...in statement
(MDN,ECMAScript 规范)。
你可以把它读作“ FOR每个属性IN的obj
对象,每个属性分配给PROPT依次变量”。
在 ES 的最新实现中,您可以使用Object.entries
:
for (const [key, value] of Object.entries(obj)) { }
或者
Object.entries(obj).forEach(([key, value]) => ...)
如果您只想迭代这些值,请使用 Object.values:
for (const value of Object.values(obj)) { }
或者
Object.values(obj).forEach(value => ...)