@Urukhayy

Почему переменная цикла конкатенируется?

Есть цикл for(var i in obj)
Если мы выведем в цикле
alert(i+7);
То получим не сумму чисел, а строку типа - 07, 17, 27 и .т.д
Как суммировать его?

Второй вопрос:
Почему переменная цикла(i), являющаяся аргументом авто-вызываемой функции в этом же цикле, принимает значения не по порядку? То есть в функцию передаются все итерации в различном порядке: 3,2,6,4,0,1....n. Как это решить?
  • Вопрос задан
  • 2201 просмотр
Решения вопроса 3
потому что вероятно i строка. т.е. typeof i == 'string'
сделайте
alert(parseInt(i)+7);

p.s.
10 + 20 = 30
"10" + 20 = "1020"
Ответ написан
Первый ответ. Потому что (элемент зачеркнуто) ключ массива obj у вас судя по всему строка а не число. А если к строке прибавить число, получим строку - 07.
Второй ответ. Потому что автовызваемая функция - замыкание. Замыкается на аргументе, который передается. Передается по прорядку, начинает выполнятся по порядку, заканчивает выполнятся в произвольном порядке. Выполняется когда приходит ее очередь, используя замкнутый в себе аргумент. Решение - не использовать автовызываемую функцию в цикле :)
Ответ написан
yttrium
@yttrium
for (var i in obj) цикл предназначеный для перечисления ключей объекта, иногда можно использовать для массивов, но очень осторожно.
for(var i = 0; i<a.length; i++) цикл для массивов, здесь индексы будут по порядку

UPD:
А чтобы переменную i не замыкало, её нужно передать в функцию в качестве аргумента
function func(i){
    return function(){
        console.log('Переменная i = ' + i + ', тип ' + typeof i);
    }
}
for(var i in [9]) {setTimeout(func(i),0);}
for(var i in {1:2}) {setTimeout(func(i),0);}

в хроме выдает
Переменная i = 0, тип string
Переменная i = 1, тип string
Как видим оба значения типа string. Это происходит потому, что цикл "for in" приводит ключи и индексы к типу string
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы