2013-07-17 2 views
0

Теперь я практикую некоторые методы в javascript, например shift(), unshift(), push(), pop(), и я хочу написать небольшую функцию, которая будет принимать 3 аргумента, массив, начальную точку, конец точка. Которая используется для вырезания части массива, а затем возвращает как новый массив, так и отрезаемую часть. Не очень полезная вещь или большое дело, просто хотите практиковать javascript.Что-то странное происходит при использовании переменной.length в цикле for

Но я встретил странную вещь, о которой я не знаю почему.

Вот странное

var a1 = []; 
var a2 = [9,8,7,6,5,4,3,2,1]; 

for(var i=0; i<a2.length; i++){ 
a1.unshift(a2.shift()) 
} 

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

a1 = [1,2,4,5,6,7,8,9] 
a2 = [] 

Однако, когда я запускаю код, это было то, что на самом деле произошло

a1 = [5,6,7,8,9] 
a2 = [4,3,2,1] 

Кажется, что функция была зациклирована недостаточно, поэтому я попытался изменить a2.length на a Тегер: 9

, которые делают код стал

var a1 = []; 
var a2 = [9,8,7,6,5,4,3,2,1]; 

for(var i=0; i<9; i++){ 
a1.unshift(a2.shift()) 
} 

И это сработало!

Тогда я изменить подход к этому

var a1 = []; 
var a2 = [9,8,7,6,5,4,3,2,1] 
var aLength = a2.length; 
for(var i=0; i<aLength; i++){ 
a1.unshift(a2.shift()) 
} 

И это сработало тоже !!!

Может ли кто-нибудь сказать мне, почему это так ??? И как я могу улучшить цикл?

Спасибо, очень ценю за ваше время.

+0

Каждая итерация для цикла уменьшает длину массив a2 на 1. Поэтому, когда он зацикливается через 5, осталось только 4, а индекс, который вы в данный момент выполняете, равен 5. 5 = 0; i -) 'или используя while while while (a2.length> 0)'. – Puuskis

+0

О, я так глуп ... Спасибо, ребята. Для ответа flav, почему внутренняя петля len не будет создавать новую копию a2.length каждый раз при запуске цикла? – Saxon

ответ

1

Вы можете легко сделать это с помощью в то время как петля

while (a2.length > 0) 
{ 
    a1.unshift(a2.shift()); 
} 
+0

Ох ... красиво сделано! Это намного проще и лучше! – Saxon

0

Javascript Массив: вахтовый метод() Метод

сдвиг() подобен методу поп(), только она работает на начало массива. Метод shift() вытаскивает первый элемент из данного массива и возвращает его. Это изменяет массив, на который был вызван метод .

Так что, когда вы делаете a2.shift() это будет на самом деле изменить (уменьшить количество элементов в массиве) массив и, таким образом, эффект

0

условие цикла переоценены для каждой итерации , и a2.length постоянно меняется.

Если вы хотите использовать его начальное значение, кэш это заранее:

var n = a2.length; 
for (var i = 0; i < n; i++) { 
    a1.unshift(a2.shift()); 
} 
Смежные вопросы