Подтвердить что ты не робот

Объявление двух переменных в цикле for

Можно ли объявить две переменные в части инициализации цикла for? Я хочу вызвать функцию для каждого символа строки.

for(var i = 0, c = aString.charAt(i); i < aString.length; i++){//problem here: not itterating
    alert("c: "+c)
    func1[typeOfChar(c)]++
}

Проблема заключается в том, что строка не повторяется в смысле c всегда является первой буквой строки. Кстати, alert был предназначен только для устранения проблем.

Мне интересно, почему c не требуется ключевое слово var при объявлении?

UPDATE: он работает. Я не собирался спрашивать, но я замечаю, что редактирование все еще выполняется, я привык не использовать полуколоны, поскольку они являются необязательными. Как можно писать цикл for без них? Я не добавляю их, потому что я вижу, что это менее просто или улучшает читаемость?

4b9b3361

Ответ 1

Вы хотите, чтобы c изменялся на каждой итерации, а не объявлял ее в начале цикла, попробуйте

var i,c;
for(i = 0,c=aString.charAt(0); i < aString.length; ++i, c = aString.charAt(i)){
    alert("c: "+c)
    func1[typeOfChar(c)]++
}

Для чего это стоит, я не думаю, что он делает очень читаемый код, я бы поставил его в первую строку.

Ниже приведена некоторая информация оператора запятой.

Также обратите внимание, что javascript не имеет ограничений по блокам для циклов, поэтому вы фактически объявляете i и c в верхней части текущей области (обычно это вершина текущей функции или верхняя часть глобальный охват).

Вот скрипка: http://jsfiddle.net/maWua/

Ответ 2

Простой способ включения нескольких инкрементных переменных в цикл for без вложенности. В этом примере объявляются 3 переменных.

for (var i = 0, j = 1, n = 2; i < 50, n < 50; i = i + 3, j = j + 3, n = n + 3){
    console.log("variable i: " + i);
    console.log("variable j: " + j);
    console.log("variable n: " + n);
}

см. codepen здесь

Ответ 3

В этом случае, поскольку c зависит только от i (и инварианта) и не используется условие цикла, я рекомендую удалить его из конструкции цикла:

// (Keep variable hoisting in mind)
for(var i = 0; i < aString.length; i++){
    var c = aString.charAt(i);
    alert("c: "+c);
    // ..
};

(Проблема с оригиналом заключается в том, что он никогда не обновляет значение c.)

Ответ 4

Вы должны просто поместить c = aString.charAt(i); внутри тела цикла.

Например:

for(var i = 0; i < aString.length; i++){
    c = aString.charAt(i);
    alert("c: "+c);
    func1[typeOfChar(c)]++ 
}

Ответ 5

Здесь:

c = aString.charAt(i)

i всегда равен нулю, поэтому он не будет работать должным образом. Инициализация происходит один раз, и вы пытаетесь получить char во время init, когда я только что был инициализирован 0.

Ответ 6

Да, это возможно с помощью нескольких var операторов, и вы сделали это успешно. Однако присвоение ему только один раз в инструкции инициализации не заставит его изменить.

Вам нужно будет сделать это один раз перед циклом и после каждого цикла поверните

for (var i=0, c=str.charAt(i); i<str.length; c=str.charAt(++i)) …

или вы делаете это перед каждым поворотом в состоянии

for (var i=0, c; c=str.charAt(i), i<str.length; i++) … // comma operator
for (var i=0, c; c=str.charAt(i); i++) … // empty string as condition

или просто переместите его внутри цикла

for (var i=0, c; i<str.length; i++) { c=str.charAt(i); … }

Ответ 7

Другим вариантом является использование while, в некоторых случаях это более ясное:

var i = 0;
while(i < aString.length){
   c = aString.charAt(i);
   alert("c: "+c)
   func1[typeOfChar(c)]++
   i++;
}