Каков наилучший способ перебора массива в классическом Asp VBScript?

в коде ниже

For i = LBound(arr) To UBound(arr)

какой смысл спрашивать с помощью LBound? Конечно, это всегда 0.

5 ответов


Почему бы не использовать For Each? Таким образом, вам не нужно заботиться о том, что LBound и UBound есть.

Dim x, y, z
x = Array(1, 2, 3)

For Each y In x
    z = DoSomethingWith(y)
Next

есть веская причина НЕ ИСПОЛЬЗОВАТЬ For i = LBound(arr) To UBound(arr)

dim arr(10) выделяет одиннадцать членов массива от 0 до 10 (при условии, что база параметров VB6 по умолчанию).

многие программисты VB6 предполагают, что массив основан на одном, и никогда не используют выделенный arr(0). Мы можем удалить потенциальный источник ошибок, используя For i = 1 To UBound(arr) или For i = 0 To UBound(arr), потому что тогда понятно, является ли arr(0) используется.

For each делает копию каждого элемента массива, вместо указки.

здесь есть две проблемы.

  1. когда мы пытаемся присвоить значение элементу массива, он не отражает оригинал. Этот код присваивает переменной значение 47 i, но не влияет на элементы arr.

    arr = Array(3,4,8)
    for each i in arr
         i = 47
    next i
    Response.Write arr(0) '- returns 3, not 47
  2. мы не знаем индекс элемента массива в for each, и нам не гарантируется последовательность элементов (хотя, похоже, она находится в порядок.)


LBound не всегда может быть 0.

хотя невозможно создать массив, который имеет что-либо, кроме нижней границы 0 в VBScript, по-прежнему можно получить массив вариантов из COM-компонента, который, возможно, указал другой LBound.

это сказало, что я никогда не сталкивался с тем, кто сделал что-то подобное.


вероятно, это происходит от VB6. Потому что с Опция Base оператор в VB6 вы можете изменить нижнюю границу массивов следующим образом:

Option Base 1

также в VB6 вы можете изменить нижнюю границу определенного массива следующим образом:

Dim myArray(4 To 42) As String

Я всегда использовал для каждого...