出于好奇,当我通过for(对象中的var p)迭代一个对象时,是一个字符串还是别的什么?我只使用一个语句初始化变量,所以我想在for循环中使用之前确保类型是正确的。
答案 0 :(得分:3)
p
的价值是关键。如果对象的所有键都是字符串,那么p
将始终是一个字符串。如果迭代Map,则键将是对象。这一切都取决于你的对象。但是,是的,大部分时间它都是一个字符串。 (如果您使用地图,则可能无需提出此问题。)
确保属性是可枚举属性的旧方法如下:
for (var p in myObject) {
if (myObject.hasOwnProperty(p)) {
// 'p' is a key for an enumerable property of myObject
}
}
使用ES5的新方法是使用Object.keys
:
Object.keys(myObject).forEach(function(p) {
// 'p' is a key for an enumerable property of myObject
});
此代码需要IE9或旧版浏览器的垫片。简而言之,Object.keys(myObject)
返回对象键的数组(仅适用于可枚举属性)。
答案 1 :(得分:2)
是的,for(var p in object)
中的p类型为string
。
使用此控件结构将对象视为关联数组(实际上它们无论如何都是相同的)。每个属性的键都分配给p
。
请注意,循环遍历这样的对象将为您提供所有可枚举属性,而不仅仅是您添加到对象中的属性,而是从原型链中继承的任何属性 。
您可以将属性限制为您添加的属性,如下所示:
for(var p in myObject) {
if(myObject.hasOwnProperty(p)) {
}
}