2016-02-24 2 views
-2

Я использовал функцию JavaScript, которая перемещает элементы массива с помощью цикла for, который принимает аргументы, но не имеет тела (пустого тела).Комплекс для цикла с пустым телом

После того, как петля for оценивает элементы массива, перетасовываются. Это codepen.

Вот код работы функции:

function shuffle(array) { // Shuffle an array 
    // 
    // + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com) 


    for(var j, x, i = array.length; 
      i; 
      j = parseInt(Math.random() * i), 
      x = array[--i], array[i] = array[j], array[j] = x){  

    } 
    return array; 
} 
console.log(shuffle(['Kevin', 'van', 'Zonneveld'])); 

Если цикл не имеет тела, я могу инициализировать все элементы вне контура for? Как показано ниже:

var j, x, i = array.length; 
var j = parseInt(Math.random() * i), x = array[--i], array[i] = array[j]; 
array[j] = x; 
+0

Цикл не имеет никаких утверждений в своем теле, но он * делает * все еще должен быть цикл, потому что он все еще работает для нескольких итераций. Поместите некоторые инструкции console.log() внутри цикла, чтобы зарегистрировать все переменные, и вы увидите, что происходит. – nnnnnn

ответ

2

Вы можете инициализировать переменные перед циклом for, но не так, как вы указали.
syntax из for петли:

for ([initialization]; [condition]; [final-expression]) 
    statement // for you this is empty - no statement 

Инициализация шаг, как вы можете увидеть, является первым, перед первой точкой с запятой (;). Таким образом, правильная инициализация будет:

var j, x, i = array.length; 

Но нет:

var j = parseInt(Math.random() * i), x = array[--i], array[i] = array[j]; 
array[j] = x; 

Поскольку эти условия и заключительные шаги экспрессии. Обратите внимание, что ваш цикл завершится, когда будет выполнено условие !i.
Нет причин для выполнения этой задачи. И если вы это сделаете, убедитесь, что вы опускаете только часть инициализации цикла for, а не какие-либо другие.

Простой способ просмотра этого цикла является:

for (
    // initialisation: declare three variables 
    var j, x, i = array.length; 
    // The loop check: when it gets to `!i`, it will exit the loop 
    i; 
    // the increment clause, made of several "sub-statements" 
    j = parseInt(Math.random() * i), 
    x = array[--i], 
    array[i] = array[j], 
    array[j] = x 
) 
    { } // The body of the loop is an empty statement 

Для полноты картины вы также можете найти его более понятный для просмотра эквивалентной while петли к этому for циклу (обратите внимание, как инициализация перед тем петля здесь):

var j, x, i = array.length; 
while (i) { 
    j = parseInt(Math.random() * i); 
    x = array[--i]; 
    array[i] = array[j]; 
    array[j] = x; 
} 
+0

Почему здесь используется для цикла? loop предназначен для реализации кода от одного до другого. здесь для цикла выполняется один раз в каждом вызове функции –

+0

Нет, он запускается несколько раз в зависимости от условия и окончательного выражения. Вы можете попробовать запустить его и убедиться сами ... он будет работать до тех пор, пока часть 'condition' не будет выполнена. – Idos

+0

Я сделал console.log, и я видел три раза его петли и в каждом цикле i уменьшался. если нигде мы не объявили, что условие let i уменьшается, почему i декрементируется, во-вторых, мы берем один из трех результатов, зачем нужен цикл? просто math.random? не так ли? –

Смежные вопросы