2015-11-10 2 views
2

Итак, я пытаюсь реализовать объект как набор в javascript, где нет дублирующих элементов или определенного порядка элементов в коллекции. Вот моя реализация с регулярными для цикла:Почему это происходит, когда цикл for in используется в Javascript?

var Set = function(elements) { 
    for(i=0;i<elements.length;i++) { 
     this[elements[i]] = true; 
    } 
}; 

И это работает как задумано:

y = new Set([4, 5, 6, 3, 2]) 
=> { '2': true, '3': true, '4': true, '5': true, '6': true } 

Однако, если я использовал для в цикле, что-то действительно странное происходит:

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 находятся в моем наборе, а не числа, которые я имел в моем массиве изначально?

+0

Похоже, что он учитывает только индексы, а не значения внутри индексов. – ryekayo

+1

Потому что 'for in' iterates _keys_. – SLaks

+2

См. Этот ответ. Цикл for предназначен для перечисления свойств, а не массивов. http://stackoverflow.com/a/3010848 – Ryan

ответ

2

for ... in петли петли ключей от объекта, указанного после in. Ключи вашего массива - 0, 1, 2 (массивы - это объекты с парами значений ключа).

0

Это потому, что вы используете массив. Массивы - это объекты, ключи которых являются индексами.

т.е.

[9, 8, 7] => {0: 9, 1: 8, 2: 7} 

После того, как вы понимаете эту реализацию, вы увидите, что это на самом деле делать правильные вещи.

Смежные вопросы