A new built-in class named Vector is proposed for ECMAScript edition 4. This class is similar to the Array class, but is designed for better performance, efficiency and error checking. Some interesting aspects of the Vector class:

* vectors are dense;

* vectors do bounds checking;

* vectors can be fixed length;

* vectors have type parameters;

* vectors have the same methods as arrays.

I’ll take a closer look at each of these bullet points, but first, here’s how the Vector class and constructor declaration will probably look in ActionScript, where ‘T’ represents a data type:

final class Vector. { function Vector(length:uint=0, fixed:boolean=false) {} …. }

The Vector class is is defined with the final attribute right now, which means that you cannot create subclasses. This could change, however, before the specification is finalized. The length parameter has a type annotation of uint, which means that the maximum vector size is 232-1 and the largest index value you can use is 232-2.

Vectors are dense

If you are familiar with ActionScript arrays, you know that they can have “holes” in them. For example, let’s say you have an array that has three elements and the length property is 3. That’s a “dense” array with no holes. However, I can write to an arbitrary index number and the array will automatically “grow” to accommodate me. For example, if I write to index 10, the length of the array will grow to 11, but the array will have a hole in it between index 3 and 9, inclusive. Or, you could look at it as having 7 holes, with each undefined element considered a hole. Having holes like this can really slow down the process of iterating through the array. Vectors, by contrast, are always dense. You cannot have holes in a vector. Every element of a vector is always defined.

Vectors do bounds checking

So what happens if I have a vector with three elements and I try to assign a value to index 10, as I did with an array in the previous paragraph? The short answer is that you get a runtime error (a RangeError to be precise). In fact, this happens even you just try to read from that index, much less write to that index.

There is a little flexibility built in, however, for those who want to change the size of the vector. First, you can “grow” a vector by assigning to the very next available index. For example, if I have a vector with three elements (index positions 0, 1, and 2), I can directly assign a fourth element to index position 3. Second, I can alter the value of the length property to grow or shrink the size of the vector. For example, if I change the length to 11, I’ll increase the size of my vector so that it contains 11 elements. This is somewhat similar to how the length property works for arrays, but the significant difference is that with vectors, all 11 of the elements are defined. Both of these techniques, however, work only if the fixed property is set to false.

Vectors can be fixed length

You may have noticed that the second parameter to the Vector constructor function is a boolean named fixed. The default value is false, but you can set this to true either at construction time or anytime thereafter using the fixed property of the Vector class. Whenever fixed is set to true, any attempt to change the size of the vector will generate a runtime error, whether the attempt is made by assigning a value to the index number that is equal to the value of length or by directly changing the value of the length property.

Vectors have type parameters

You can use type parameters to designate that you want a “mono-typed” vector, which means that the vector can contain values of only one specific type. For example, you can define a vector that holds only integers and has a fixed length of 7 by declaring:

var intVector:Vector. = new Vector.(7, true)

The resulting intVector vector will be constrained to values of type int.

Vectors have the same methods as Arrays

The current plan is for the Vector class to have as many of the Array methods as possible. Vector will contain not only the traditional methods such as push(), pop(), slice(), sort(), etc., but also some of the newer methods such as every(), filter(), indexOf(), some(), etc. A complete list should be available soon on ecmascript.org.

This only scratches the surface of the new Vector class. Rest assured that there will be more to come about this new built-in class as we move forward with the draft specification. Here are some relevant links on the ecmascript.org site:

- Vectors proposal on the ecmascript.org wiki
- Open Trac issue that discusses whether Vector will be final (see comments)
- You can download an early version of the ES4 reference implementation and play with the Vector class.