2014-06-10 5 views
1

Я хотел бы знать, может ли быть третий условный аргумент (выражение/выражение?) В цикле for. Например, если функция должна была вызываться с необязательным третьим аргументом, наличие или отсутствие этого необязательного аргумента определяло бы третью операцию.Возможно ли иметь условное третье выражение в цикле for?

function doThing(arg1, arg2, optional) { 
    var args = arguments; 
    for (var i = arg1; arg1 < arg2; args[2] ? i = i+optional : i++) { 
     // Do stuff 
    } 
} 

Я не могу найти что-либо касающееся этого онлайн, поэтому я предполагаю, что, вероятно, нет; если бы не лучший способ создать такую ​​же функциональность?

+0

ли определить ваш 'optional' переменной, сколько шагов для увеличения' i'? – showdev

+0

@showdev - в этом примере да, извините, что не было ясно. Но это не обязательно, я полагаю. – verism

+0

Почему смешанный синтаксис использования именованных аргументов, а также использование 'args [2]'? Почему бы просто не использовать одно или другое? –

ответ

4

По http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.3

IterationStatement : for (ExpressionNoIn opt ; Expression opt ; Expression opt) Statement 

Вы можете видеть, что третий аргумент for является выражением. Таким образом, можно использовать все, что является допустимым выражением.

args[2] ? i = i+optional : i++ является допустимым выражением.

Я предпочел бы определить его как:

i += args[2] ? optional : 1 
+0

Трудно выбрать ответ, учитывая множество полезных предложений, но я принимаю это, поскольку он непосредственно решает проблему. – verism

2

Нет, но вы всегда можете переписать for петли на выход из инкремента и вручную его обработки внутри цикла:

for (var i = arg1; arg1 < arg2;) { 
    // Do stuff 

    if (condition) { 
     i = i + optional; 
    } else { 
     i++; 
    } 
} 

Вашего случай, однако, может быть упрощено переписать в виде:

for (var i = arg1; arg1 < arg2; i += (condition ? optional : 1)) 

Если логика более сложна, то простое приращение, то использование первого примера будет лучше.

1

Да, вы можете это сделать, но это потребует переоценки args[2] на каждой итерации, что может быть немного неэффективным. Я рекомендовал бы немного другой вариант:

function doThing(arg1, arg2, optional) { 
    var inc = optional || 1; 
    for (var i = arg1; arg1 < arg2; i += inc) { 
     // Do stuff 
    } 
} 

Таким образом, вы только должны определить значение inc (сколько приращения i на в цикле) один раз, то вы можете использовать это значение во всем остальном функции.

+0

@verism Да, извините. Это была опечатка. –

4

Вы можете сделать:

var step = (optional === undefined ? 1 : optional); 
for (var i = arg1; i < arg2; i += step) { 
    ... 
} 
Смежные вопросы