#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);