Безопасно ли использовать этот тип цикла в Javascript?
denseArray = [1,2,3,4,5, '...', 99999]
var x, i = 0
while (x = denseArray[i++]) {
document.write(x + '<br>')
console.log(x)
}
document.write('Used sentinel: ' + denseArray[i])
document.write('Size of array: ' + i)
Короче, чем цикл for, и, возможно, также более эффективно для больших массивов использовать встроенный сторож.A sentinel указывает вызывающей стороне на тот факт, что произошло нечто необычное .
Массив должен быть плотным массивом на работу!Это означает, что нет другого значения undefined
, кроме значения, которое идет после последнего элемента в массиве .Я почти никогда не использую разреженные массивы, только плотные массивы, так что это нормально для меня.
Еще один важный момент, о котором следует помнить (спасибо @Jack Bashford), это , который не просто не определен в качестве дозорного.Если значение массива 0, false или любое другое ложное значение, цикл остановится .Таким образом, вы должны быть уверены, что данные в массиве не имеют ложных значений , то есть 0
, ""
, ''
, ``, null
, undefined
и NaN
.
Есть ли здесь какая-то проблема «вне диапазона», или мы можем считать массивы в Javascript «бесконечными», поскольку длинная память не заполнена?Означает ли неопределенное, что браузеры могут установить для него любое значение, потому что оно не определено, или мы можем считать, что условный тест всегда работает?Массивы в Javascript странны, потому что «они являются объектами», поэтому лучше спросить.
Я не могу найти ответ по Stackoverflow, используя следующие теги: [javascript] [sentinel] [while-loop] [arrays]
. Это дает нулевой результат !
Я думал об этом некоторое время и использовал его достаточно, чтобы начать беспокоиться.Но я хочу использовать это, потому что это элегантно, легко увидеть, коротко, возможно, эффективно для больших данных.Полезно, чтобы i
был размером массива.
ОБНОВЛЕНИЯ
- @ Бармар сказал: JS гарантирует, что неинициализированный массивэлемент вернет значение undefined.
- MDN подтверждает : Использование неверного номера индекса возвращает неопределенное значение.
- Примечание @ schu34: Лучше использовать
denseArray.forEach((x)=>{...code})
, оптимизированный для его использования и известный разработчикам.Не нужно сталкиваться с ложными ценностями.Он имеет хорошую поддержку браузера .