Выполнение обратного цикла через массив javascript с помощью array.length с использованием цикла for

#javascript #arrays #for-loop #control-flow

#javascript #массивы #for-loop #поток управления

Вопрос:

Если у меня есть array = [8,7,6,5,4], который я хочу выполнить, почему следующий цикл for все еще работает, хотя длина массива равна 5, а в индексе 5 массива нет элемента?

 for(let i=array.length;i>=0;i  ){
  //do something 
}
  

Я знаю, что было бы точнее вычесть 1 из длины, но почему приведенный выше код все еще работает

Комментарии:

1. Вы должны вычитать 1 из i в каждом цикле. Например, i-- вместо i

2. array.forEach(item => /* … Сделайте что-нибудь … */ )

3. Это зависит от того, что вы подразумеваете под «работой». Вы ничего не делаете в цикле, поэтому мы не знаем, что работает, а что нет. Доступ array[i] работает только в том случае, если вы считаете неопределенные значения рабочими.

4. Можете ли вы показать нам фрагмент с примером того, как этот код «работает»?

5. Я знаю, что это было бы более точным… НЕТ, это было бы правильно (по сравнению с неправильным). Речь не идет о более или менее «точном». i будет продолжать увеличиваться и, в конечном итоге , завершится отрицательными значениями дополнения 2 и завершит цикл, поскольку целое число имеет конечное максимальное значение. Ваш цикл будет много обходов без всякой причины, что займет гораздо больше времени, чем необходимо. Что именно делает «что-то делать»?

Ответ №1:

Почти. Вы должны:

  • Уменьшать i вместо увеличения, и
  • Начните с array.length-1 , потому что индексы массива начинаются с 0, а не с 1.

Поэтому используйте вместо:

 for (let i = array.length-1; i >=0 ; i--) {
  

Ответ №2:

Это происходит потому, что массивы в Javascirpt не ограничены размером, который они были объявлены. Итак, это подразумевает, что если вы попытаетесь получить доступ к пустой позиции, вы получите undefined . Например, в этом случае, если вы это сделаете, array[5] вы получите undefined , а не ArrayIndexOutOfBoundsException как это произошло бы в Java.

Кроме того, вам следует заглянуть в свой код. Поскольку вы повторяете массив в обратном направлении, вы можете уменьшить его i на i-- вместо увеличения.

Комментарии:

1. Спасибо, это лучше всего отвечает на мой вопрос, уменьшение i было опечаткой.

Ответ №3:

Потому что это так:

 const array = [1,2,3,4];
for(let i=10;i>=0;i--){
  console.log(array[i]);
}  

Вы можете зацикливать все, что захотите. В javascript все является объектом, включая array. Доступ к чему-либо, чего не существует в object с [] , возвращает undefined.

Ответ №4:

 for(let i=array.length-1;i>=0;i--){
  //do something 
}
  

вам нужно установить i длину массива -1 (поскольку индекс массива начинается с 0). Затем каждый раз, когда вы проходите цикл, вам нужно вычитать единицу из i ( i-- )

ваш код работает, но будет выполняться через цикл огромное количество раз, пока число не превратится в отрицательное. Попробуйте добавить console.log(i) в свой цикл, чтобы понять, что я имею в виду. (скорее всего, chrome зависнет, если вы сделаете это в инспекторе)

Ответ №5:

Длина массива равна количеству записей, предполагающих, что все они были заполнены. Разреженные массивы имеют длину, не равную количеству элементов в них, но основанную на максимальном индексе в них

Например:

 let a = [];
a[10] = 1;
console.log(a.length);
console.log(a);  

Длина равна 11 (от 0 до 10), и вы можете видеть, что для индекса от 0 до 9 есть значения undefined .

Даже установка последнего значения в undefined не влияет на длину, поскольку в этой позиции все еще остается значение undefined .

 let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);

a[10] = undefined
console.log(a.length);  

Использование delete по-прежнему не влияет на длину.

 let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);

delete a[10];
console.log(a.length);  

Единственный способ изменить длину — создать новый массив как подмножество исходного:

 let a = [];
a[9] = 1;
a[10] = 1;
console.log(a.length);
console.log(a);

a = a.slice(0,9);
console.log(a.length);
console.log(a);