spacer
Yehuda Shiran March 29, 2000
Programming a FIFO Queue
Tips: March 2000

Yehuda Shiran, Ph.D.
Doc JavaScript

Developer News
Google Going Native With Chrome
Mozilla Fixes Firefox Flaws as 3.5 Release Nears
Microsoft and Novell Still Bosom Buddies

The shift() and unshift() methods are similar to the push() and pop() methods. The difference is that while the push() and pop() methods add and remove elements from the end of the array, the shift() and unshift() methods roll out and in elements from the beginning of the array. The push() and pop() methods support the Stack abstract data type, which is based on the LIFO (Last In First Out) model. The shift() and unshift() methods, on the other hand, support the FIFO (First In First Out) model.

The shift() method shifts off and returns the first element of the array, decreasing its size by one. Here is the method to be declared as a prototype of the Array object type:

function shift(str) {
  var val = this[0];
  for (var i = 1; i < this.length; ++i) {
    this[i-1] = this[i];
  }
  this.length--;
  return val;
}

The first line sets the returned value, the first element of the array. The for loop iterates over the array elements and shifts every element to its previous position:

this[i-1] = this[i];

The last two lines decrement the size of the array by one and returned the value of the first element, val.

When the browser is a pre-5.5 version of Internet Explorer, we need to extend the Array's prototype with the new shift() method:

if (bName() == 1 && bVer() >= 5.5)
else {
  Array.prototype.shift = shift;
}

We do nothing when the browser is IE 5.5 or higher. For other browsers or lower versions, we assign the home-brewed shift() method.

The unshift() method appends a list of elements to the beginning of the array. Here is our implementation:

function unshift() {
  var i = unshift.arguments.length;
  for (var j = this.length - 1; j >= 0; --j) {
    this[j + i] = this[j];
  }
  for (j = 0; j < i; ++j) {
    this[j] = unshift.argument[j];
  }
}

We extract the number of new elements, i, from the arguments array's length. The first for loop shifts all existing elements i places up:

this[j + i] = this[j];

The second for loop inserts the new elements into the first i places of the array:

this[j] = unshift.arguments[j];

When the browser is a pre-5.5 version, we need to extend the Array's prototype with the new unshift() method:

if (bName() == 1 && bVer() >= 5.5)
else {
  Array.prototype.unshift = unshift;
}

We do nothing when the browser is IE 5.5 or higher. For lower versions, we assign the home-brewed unshift() method.

See a demo of the above methods in Column 59, IE 5.5: Formatting, URIs, and Stack Operations.


People who read this tip also read these tips:

Look for similar tips by subject:

internet.commediabistro.comJusttechjobs.comGraphics.com

Search:

WebMediaBrands Corporate Info

Legal Notices, Licensing, Reprints, Permissions, Privacy Policy.
Advertise | Newsletters | Shopping | E-mail Offers | Freelance Jobs

webref The latest from WebReference.com Browse >
XML and PHP Simplified · Creating a ASP.NET Contact Form · Data Filtering with PHP
Sitemap · Experts · Tools · Services · Email a Colleague · Contact FREE Newsletters 
 The latest from internet.com
Intel to Host Live Nehalem Q&A · 12 Tips to Troubleshoot Network File-Sharing · 10 Tips for Selling on Kijiji