Объявление двух переменных в цикле 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 без них? Я не добавляю их, потому что я вижу, что это менее просто или улучшает читаемость?
Ответы
Ответ 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++;
}