MSc-IT Study Material
June 2010 Edition

Computer Science Department, University of Cape Town

Arrays

Introduction to arrays

Arrays provide a tabular way to organise a collection of related data. For example, if we wished to store the seven names of each weekday as Strings, we could use an array containing seven elements. This array would be structured as follows:

IndexValue
weekDays[0]"Monday"
weekDays[1]"Tuesday"
weekDays[2]"Wednesday"
weekDays[3]"Thursday"
weekDays[4]"Friday"
weekDays[5]"Saturday"
weekDays[6]"Sunday"

As can be seen all of these different String values are stored under the collective name weekDays, and a number (from 0 to 6) is used to state which of these weekDays values we specifically wish to refer to. So by referring to weekDays[3] we could retrieve the String "Thursday".

DEFINITION - Array

An array is a tabular arrangement of values. Values can be retrieved by referring to the array name together with the numeric index of the part of the table storing the desired value.

As you may have spotted, by having a loop with a numeric variable we can easily perform an action on all, or some sub-sequence, of the values stored in the array.

Indexing of array elements

As can be seen from the above figure, there are seven elements in the weekDays array.

DEFINITION — element

Arrays are composed of a numbered sequence of elements. Each element of an array can be thought of as a row (or sometimes column) in a table of values.

The seven elements are indexed (numbered) from zero (0) to six (6). Although it might seem strange to start by numbering the first element at zero, this way of indexing array elements is common to many high-level programming languages (include C, C++ and Java), and has some computational advantages over arrays that start at 1.

Note

The index of an array element is also known as its subscript. The terms array index and array subscript can be used interchangeably. In this unit we consistently use the term index for simplicity.

Exercise 1

Answer the following questions about the weekDays array:

  • What is the first element?

  • What is the last element?

  • What is the 4th element?

  • What is the value of the first element?

  • What is the value of the 4th element?

  • What is the element containing String "Monday"?

  • What is the element containing String "Saturday"?

  • What is the index of the element containing String "Monday"?

  • What is the index of the element containing String "Saturday"?

Creating arrays and assigning values to their elements

There are a number of different ways to create an array. One piece of JavaScript code that creates such an array is as follows:

// VERSION 1
var weekDays = new Array(7);
weekDays[0] = "Monday";
weekDays[1] = "Tuesday";
weekDays[2] = "Wednesday";
weekDays[3] = "Thursday";
weekDays[4] = "Friday";
weekDays[5] = "Saturday";
weekDays[6] = "Sunday";
      

The first (non-comment) line is:

var weekDays = new Array(7);

This line declares a new variable called weekDays and makes this new variable refer to a new Array object that can hold seven elements.

Note

The concept of arrays as objects is discussed later this unit.

The seven statements that follow this line assign the Strings "Monday" - "Sunday" to the array elements weekDays[0] to weekDays[6] respectively.

Creating and initialising arrays in a single statement

Another piece of JavaScript that would result in the same array as VERSION 1 above is the following:

// VERSION 2 - all in one line
var weekDays = new Array( "Monday", "Tuesday", "Wednesday", 
    "Thursday", "Friday", "Saturday", "Sunday");
      

This single statement combines the declaration of a new variable and Array object with assigning the seven weekday Strings. Notice that we have not had to specify the size of the array, since JavaScript knows there are seven Strings and so makes the array have a size of seven elements.

The above examples illustrate that arrays can either be created separately (as in VERSION 1), and then have values assigned to elements, or that arrays can be created and provided with initial values all in one statement (VERSION 2).

When declaring the array, if you know which values the array should hold you would likely choose to create the array and provide the initial values in one statement. Otherwise the two-stage approach of first creating the array, and then later assigning the values, is appropriate.

Displaying the contents of arrays

The easiest way to display the contents of an array is to simply use the document.write() function. This function, when given an array name as an argument, will display each element of the array on the same line, separated by commas. For example, the code:

var weekDays = new Array( "Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday", "Sunday");
document.write( "<b7gt;weekDays: </b7gt;" + weekDays);
      

Produces the following output in a browser:

Array length

The term length, rather than size, is used to refer to the number of elements in array. The reason for this will become clear shortly.

As illustrated in the VERSION 1 code above, the size of an array can be specified when an array is declared:

var weekDays = new Array(7);

This creates an array with seven elements (each containing an undefined value):

IndexValue
weekDays[0]<undefined>
weekDays[1]<undefined>
weekDays[2]<undefined>
weekDays[3]<undefined>
weekDays[4]<undefined>
weekDays[5]<undefined>
weekDays[6]<undefined>

In fact, while this is good programming practice, it is not a requirement of the JavaScript language. The line written without the array size is just as acceptable to JavaScript:

var weekDays = new Array();
      

this creates an array, with no elements:

IndexValue
  

In this second case, JavaScript will make appropriate changes to its memory organisation later, once it identifies how many elements the array needs to hold. Even then, JavaScript is a can extend the size of an array to contain more elements than it was originally defined to contain.

For example, if we next have the statement:

weekDays[4] = "Friday";
 

the JavaScript interpreter will identify the need for the weekDays array to have at least five elements, and for which the 5th element is the String "Friday".

IndexValue
weekDays[0]<undefined>
weekDays[1]<undefined>
weekDays[2]<undefined>
weekDays[3]<undefined>
weekDays[4]"Friday"

If this were then followed by the statement:

weekDays[6] = "Sunday";
      

the JavaScript interpreter will identify the need for the weekDays array to now have seven elements, of which the 5th contains the String "Friday" and the 7th contains "Sunday":

IndexValue
weekDays[0]<undefined>
weekDays[1]<undefined>
weekDays[2]<undefined>
weekDays[3]<undefined>
weekDays[4]"Friday"
weekDays[5]<undefined>
weekDays[6]"Sunday"

Once created, an array has a length property. This stores the number of elements for which JavaScript has made space. Consider the following statements:

var weekDays = new Array(7);
var months = new Array();
var bits = new Array(17, 8, 99);
 

The length of each of these arrays is as follows:

  • weekDays.length = 7

  • months.length = 0

  • bits.length = 3

One needs to be careful, though, since making the length of an array smaller can result in losing some elements irretrievably. Consider this code and the following output:

var bits = new Array(17, 8, 99, 33, 66, 11);document.write(bits);
document.write("<br> array length: " + bits.length); bits.length = 4;
document.write("<p> after change: p>"); document.write(bits);
document.write("<br> array length: " + bits.length);
 

the browser output from such code is:

As can be seen, after the statement bits.length = 4; the last two array elements have been lost.

Types of values in array elements

In most high-level programming languages arrays are typed. This means that when an array is created the programmer must specify the type of the value to be stored in the array. With such languages, all elements of an array store values of a single type. However, JavaScript is not a strongly typed programming language, and a feature of JavaScript arrays is that a single array can store values of different types.

Consider the following code:

var things = new Array();
things[0] = 21;
things[1] = "hello";
things[2] = true;

document.write("<p>[0]: " + things[0]); document.write("<p>[1]: " 
  + things[1]); document.write("<p>[2]: " + things[2]);
      

As can be seen, this is perfectly acceptable JavaScript programming:

When the value of an array element is replaced with a different value, there is no requirement for the replacement value to be of the same type. In the example below, array element 1 begins with the String "hello", is then changed to the Boolean value false, and changed again to the number 3.1415:

var things = new Array();
things[0] = 21;
things[1] = "hello";
things[2] = true;
things[1] = false;
things[1] = 3.1415;

document.write("<p>[0]: " + things[0]); document.write("<p>[1]: "
   + things[1]); document.write("<p>[2]: " + things[2]);
      

As can be seen, this changing of array element values of different types works without problems:

We can confirm that a single array can store values of different types by displaying the return value of the typeof function:

var things = new Array();
things[0] = 21;
things[1] = "hello";
things[2] = true;

document.write("<p>type of things[0]: " + typeof things[0] );
document.write("<p>type of things[1]: " + typeof things[1] );
document.write("<p>type of things[2]: " + typeof things[2] );
      

The output of the above code is as follows:

Strings are NOT arrays

In many programming languages, text strings are represented as arrays of characters. While this makes sense in non-object oriented languages, there are a number of advantages of representing data such as text as objects (see later this unit).

You will only obtain undefined values if you attempt to refer to particular characters of Strings using the square bracket array indexing syntax.

So the code:

     var firstName = "Matthew";
     document.write("second letter of name is: " + firstName[1]);
      

results in the following output on screen:

It is also easy to confuse String and Array objects because they both have a length property. So the code:

var firstName = "Matthew";
document.write("second letter of name is: " + firstName[1]);
document.write("<p>length of 'firstName' " + firstName.length);
      

is valid, and we do see the number of characters of the String displayed:

However, the similarity is because both Strings and Arrays are objects — see later in this unit for a detailed discussion of JavaScript objects.

Variables — primitive types and reference types

When one begins to work with collections of values (e.g. with arrays or objects), one needs to be aware of the variable's value. A variable containing a primitive type value is straightforward: for example consider the numeric variable age in this code:

    var age = 21;
      

However, the situation is not so simple when we consider an array variable. For example the ageList array of three ages defined as follows:

    var ageList = new Array( 3 );

    ageList[0] = 5;
    ageList[1] = 3;
    ageList[2] = 11;
      

It is not the case that ageList is the name for a single location in memory, since we know that this array is storing three different values. The location in memory named ageList is actually a reference to the place in memory where the first value in the array can be found. The diagram below attempts to illustrate this:

Note

There is nothing special about the locations 001727 etc., these numbers have been made up and included to illustrate unnamed locations in memory.

So we can think of the variable ageList as referring to where the array values can be found.

The implication of the different between variables of primitive types and reference types is rather important, especially in the case of copying or overwriting the values of reference variables.

Copying primitive type variables

With primitive type variables it is straightforward to copy and change values. Consider the following code:

   var name1 = "ibrahim";
   var name2 = "james";
      

Initially the memory looks as follows:

Memory LocationValue
name1"Ibrahim"
name2"James"

Then if we execute the following lines:

  name1 = name2;
  name2 = "fred";
      

the values in memory will be:

Memory LocationValue
name1"James"
name2"fred"

What is happening is that when one variable is assigned the value of a second, a copy of the second variable's value is placed into the location in memory for the first — so a copy of the value "james" from name2 was copied into the location for name1.

Copying reference type variables

Things are different when one is working with variables of reference types. Consider the following code, where first an array called myArray is created with some initial values, next a variable called thing2 is assigned the value of myArray:

var myArray = new Array( 6, 3, 5, 1 );
var thing2 = myArray; 
      

Since myArray is a reference to the array values in memory, what has been copied into thing2 is the reference — so now both myArray and thing2 are referring to the same set of values in memory:

The implications are that if a change is made to the array values, since both myArray and thing2 are referring to the same values in memory, both will be referring to the changed array.

Exercise 2

What is the value of myArray[2] after the following statements have been executed?

var myArray = new Array( 6, 3, 5, 1 );
var thing2 = myArray;

thing2[1] = 27;
thing2[2] = 19;
thing2[3] = 77;
        

Array activities

Activity 1: Creating and displaying elements of an array

Write an HTML file that creates an array called ages containing the following numbers: 21, 14, 33, 66, 11.

Write code so that the values of array elements 0, 1 and 3 are displayed. The screen should look similar to the following when the page is loaded:

You can find a discussion of this activity at the end of the unit.

Activity 2: Iterating through array contents

Create an array called primes containing the following numbers: 1, 2, 3, 5, 7, 11.

Write a while loop that will iterate (loop) through each element of the array, displaying each number on a separate line. Your code should be written in a general way, so if more numbers were added to the array (say 13, 17 and 19) the loop code would not need to be changed.

The browser output should be something like:

You can find a discussion of this activity at the end of the unit.

Activity 3: Animation using an array of Image objects

Create a Web page that shows an image, and when the mouse goes over this image the image is replaced with an animation of 3 other images before returning back to the original image. Make the original image: silence.gif, with browser output as follows:

Make the three images that are animated: taptap.gif, knockknock.gif and BANGBANG.gif, with browser outputs as follows:

Create an array of Image objects called images. You only need to refer to the src property as in the following lines:

        // set up image array
        images[0] = new Image();
        images[0].src = "taptap.gif";
        

In the body section of the HTML file display the silence image (naming it noise) with an appropriate onMouseOver JavaScript one-liner:

        <BODY>
        IMG NAME="noise" SRC="silence.gif" onMouseOver="startAnimation()">
        </BODY>
        

Create a function startAnimation() that sets the delay time and the imageNumber to display first in the animation.

Your startAnimation() function should then make a call to an animate() function written as follows:

        function animate()
        {
          document.noise.src = images[ imageNumber ].src;
          imageNumber++;
          delay += 250;

          if( imageNumber < 4 )

          setTimeout( "animate()", delay );

          // if imageNumber = 4 the animation has finished
          // and this function can terminate

        }
        

You might create a simple version with an unchanging delay of 500 milliseconds initially.

Notice how the line:

        document.noise.src = images[ imageNumber ].src;
        

refers to the NAME of the image from the IMG tag, and resets the src property of this Image object to the appropriate array Image object src.

You can find a discussion of this activity at the end of the unit.

Arrays concept map

This figure illustrates the way different array concepts can be related.