为什么在Javascript中使用for-in循环时会发生这种情况?

为什么在Javascript中使用for-in循环时会发生这种情况?,javascript,for-loop,javascript-objects,for-in-loop,Javascript,For Loop,Javascript Objects,For In Loop,因此,我尝试在javascript中实现一个对象作为集合,其中集合中没有重复的元素或元素的特定顺序。下面是我对常规for循环的实现: var Set = function(elements) { for(i=0;i<elements.length;i++) { this[elements[i]] = true; } }; 但是,如果我使用for in循环,会发生一些非常奇怪的事情: var Set = function(elements) { fo

因此,我尝试在javascript中实现一个对象作为集合,其中集合中没有重复的元素或元素的特定顺序。下面是我对常规for循环的实现:

var Set = function(elements) {
    for(i=0;i<elements.length;i++) {
        this[elements[i]] = true;
    }
};
但是,如果我使用for in循环,会发生一些非常奇怪的事情:

var Set = function(elements) {
    for(var elem in elements) {
        this[elem] = true;
    }
};

   t = new Set([9, 8, 7])
=> { '0': true, '1': true, '2': true }

为什么for-in循环会导致元素0、1和2在我的集合中,而不是我最初在数组中的数字?

for-in循环不会循环元素的值,而是循环键

一个数组确实有键,使用索引,所以每个
elem
得到的是索引


您的资源:

用于。。。在
中,在
中的after
中指定的对象的键上循环。数组的键是0、1、2(数组是具有键值对的对象)。

这是因为您使用的是数组。数组只是键为索引的对象

i、 e


一旦您了解了这个实现,您将看到它实际上做了正确的事情。

看起来它只是在计算索引,而不是索引中的值,因为
对于in
迭代键。请参见此答案。for循环用于枚举属性,而不是数组。哦,好的,我现在明白了,这与python中的for-in循环的工作方式不同。。
var Set = function(elements) {
    for(var elem in elements) {
        this[elem] = true;
    }
};

   t = new Set([9, 8, 7])
=> { '0': true, '1': true, '2': true }
[9, 8, 7] => {0: 9, 1: 8, 2: 7}