Ну это, как бы, не плохо выглядит, но есть просто 1 момент, связанный с выбором
while вида конструкции цикла.
Просто в JavaScript есть, насколько мне известно, 3 основных вида конструкций циклов:
while,
do ... while и
for, из которых каждый заточен под определенную логику работы.
Так вот, цикл
while изначально удобен для выполнения 0 или бесконечно неограниченное количество итераций, хотя и должен рано ли поздно прерываться каким-либо доступным образом: либо состоянием
false значения в скобках (), либо инструкцией
break или
continue внутри {}.
Цикл
do ... while изначально удобен для выполнения 1 или бесконечно неограниченное количество итераций, где все остальное можно взять из написанного про цикл while...
А вот, цикл
for изначально удобен для отрабатывания от 1 и до четко известного X количества раз, не больше и не меньше хотя остается возможность досрочно прервать и завершить текущую итерацию с помощью инструкций
break или
continue, поместив их внутрь {} конструкции for. Цикл заканчивает свою работу по состоянию
false значения или выражения, которое должно стоять на 2-м месте после
; внутри () цикла, т.е. for('
что-то, что надо сделать перед началом цикла'; '
значение или выражение интерпретируемое как true или false'; '
что-то, что надо сделать последним в конце любой итерации цикла').
Таким образом, удобнее и логичнее использовать конструкцию for(var a=0; a < colors.length; a++){} чем: var a=0;while(a < colors.length){... a++;}, хотя, в целом, обе такие конструкции и работают в данном случае одинаково.
Вот как-то так вот