在 Object.keys() 上使用 for..in 打印了错误的键
Wrong keys are printed using for..in on Object.keys()
考虑这个对象:var obj = {10: 0, 11: 1, 12: 2};
使用方法Object.keys(obj)
,可以看到obj
有三个key:10,11,12.
但是,如果您想遍历每个键(例如,为了获取每个键的值),标准的 for 循环 returns 正确的键,但是 "for in"风格没有。有谁知道这里发生了什么?是否可以使用 "for in" 获得正确的键名?
JSFiddle:http://jsfiddle.net/n7sm22kb/
在您的具体示例中,这是因为 Object.keys
returns 一个数组。 for ... in
和 Object.keys
做的事情非常相似,所以你要遍历键数组 的键 ,因此你的问题。
你可以通过运行看到这个:
var obj = {10: 0, 11: 1, 12: 2};
var keys = Object.keys(obj); // ['10', '11', '12'];
for (var key in keys) {
console.log('Keys has', keys[key], 'at', key);
}
使用 for ... in
的正确等价物更像是:
for(var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(obj[key]);
}
}
您可以看到此处介绍的额外复杂性。
for ... in
(#12.6.4 in the spec) 遍历对象中的所有可枚举属性,包括从原型继承的属性,导致它包含很多您可能需要过滤掉的东西。在数组的情况下,它遍历数组中每个项目的 属性 名称(即数组索引)。这是您 运行 遇到问题的第二级间接寻址。
Object.keys
(#15.2.3.14 in the spec) 被定义为仅从对象本身 ("For each own enumerable property...") 中检索键,这样您就无需进行该检查。
如果可能,在大多数情况下首选 Object.keys
,因为它可以节省您的逻辑。如果 [].forEach
可用,您还可以使用:
Object.keys(obj).forEach(function (key) {
console.log('Object has', obj[key], 'at', key);
});
我怀疑@jlewkovich 想要使用
for (key of Object.keys(obj)) {
而不是:
for (key in Object,keys(obj)) {
注意属于而不是属于。我这么说是因为我犯了那个错误才找到这个页面。
PS:我试图将此添加为评论,但没有声望点,所以请原谅我认为评论更合适的新答案。 @ssube 回答了这个问题。这是我认为作者想问的另一个问题的答案。
考虑这个对象:var obj = {10: 0, 11: 1, 12: 2};
使用方法Object.keys(obj)
,可以看到obj
有三个key:10,11,12.
但是,如果您想遍历每个键(例如,为了获取每个键的值),标准的 for 循环 returns 正确的键,但是 "for in"风格没有。有谁知道这里发生了什么?是否可以使用 "for in" 获得正确的键名?
JSFiddle:http://jsfiddle.net/n7sm22kb/
在您的具体示例中,这是因为 Object.keys
returns 一个数组。 for ... in
和 Object.keys
做的事情非常相似,所以你要遍历键数组 的键 ,因此你的问题。
你可以通过运行看到这个:
var obj = {10: 0, 11: 1, 12: 2};
var keys = Object.keys(obj); // ['10', '11', '12'];
for (var key in keys) {
console.log('Keys has', keys[key], 'at', key);
}
使用 for ... in
的正确等价物更像是:
for(var key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(obj[key]);
}
}
您可以看到此处介绍的额外复杂性。
for ... in
(#12.6.4 in the spec) 遍历对象中的所有可枚举属性,包括从原型继承的属性,导致它包含很多您可能需要过滤掉的东西。在数组的情况下,它遍历数组中每个项目的 属性 名称(即数组索引)。这是您 运行 遇到问题的第二级间接寻址。
Object.keys
(#15.2.3.14 in the spec) 被定义为仅从对象本身 ("For each own enumerable property...") 中检索键,这样您就无需进行该检查。
如果可能,在大多数情况下首选 Object.keys
,因为它可以节省您的逻辑。如果 [].forEach
可用,您还可以使用:
Object.keys(obj).forEach(function (key) {
console.log('Object has', obj[key], 'at', key);
});
我怀疑@jlewkovich 想要使用
for (key of Object.keys(obj)) {
而不是:
for (key in Object,keys(obj)) {
注意属于而不是属于。我这么说是因为我犯了那个错误才找到这个页面。
PS:我试图将此添加为评论,但没有声望点,所以请原谅我认为评论更合适的新答案。 @ssube 回答了这个问题。这是我认为作者想问的另一个问题的答案。