栈方法
栈是一种 LIFO(Last-In-First-Out,后进先出)的数据结构,也就是最新添加的项最早被移除。而栈中项的插入(叫做推入)和移除(叫做弹出),只发生在一个位置——栈的顶部。ECMAScript 为数组专门提供了 push() 和 pop() 方法,以便实现类似栈的行为。
push() 方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。而pop() 方法则从数组末尾移除最后一项,减少数组的 length 值,然后返回移除的项。请看下面的例子:
var fruits= new Array(); // 创建一个数组
var count = colors.push("apple", "orange"); // 插入两项
console.log(count); //2
count = fruits.push("lemon"); // 插入另一项
console.log(count); //3
var item = fruits.pop(); // 取得最后一项
alert(item); //"lemon"
alert(fruits.length); //2
以上代码中的数组可以看成是栈(代码本身没有任何区别,而 push() 和 pop() 都是数组默认的方法)。首先,我们使用 push() 将两个字符串推入数组的末尾,并将返回的结果保存在变量 count 中(值为 2)。然后,再推入一个值,而结果仍然保存在 count 中。因为此时数组中包含 3 项,所以 push()返回 3。在调用 pop() 时,它会返回数组的最后一项,即字符串 "lemon" 。此后,数组中仅剩两项。
可以将栈方法与其他数组方法连用,像下面这个例子一样。
var fruits= ["apple", "orange"];
fruits.push("lemon"); // 添加另一项
fruits[3] = "Mango"; // 添加一项
console.log(fruits.length); // 4
var item = fruits.pop(); // 取得最后一项
alert(item); //"Mango"
在此,我们首先用两个值来初始化一个数组。然后,使用 push() 添加第三个值,再通过直接在位
置 3 上赋值来添加第四个值。而在调用 pop() 时,该方法返回了字符串 "Mango" ,即最后一个添加到数
组的值。
队列方法
队列数据结构的访问规则是 FIFO(First-In-First-Out,先进先出)。队列在列表的末端添加项,从列表的前端移除项。结合使用 shift() 和 push() 方法,就可以实现队列。push() 方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。 shift() 方法能够移除数组中的第一个项并返回该项,同时将数组长度减 1。
var fruits= new Array(); //创建一个数组
var count = fruits.push("apple", "orange"); //推入两项
console.log(count); //2
count = fruits.push("lemon"); //推入另一项
console.log(count); //3
var item = fruits.shift(); // 取得第一项
console.log(item); //"red"
console.log(fruits.length); //2
这个例子首先使用 push() 方法创建了一个包含 3 种水果名称的数组。代码中使用shift() 方法从数组中取得了第一项,即 "apple" 。在移除第一项之后, "orange" 就变成了第一项,而"lemon" 则变成了第二项,数组也只包含两项了。
ECMAScript 还为数组提供了一个 unshift() 方法。顾名思义, unshift() 与 shift() 的用途相反:它能在数组前端添加任意个项并返回新数组的长度。因此,同时使用 unshift() 和 pop() 方法,可以从相反的方向来模拟队列,即在数组的前端添加项,从数组末端移除项,如下面的例子所示。
var colors = new Array(); //创建一个数组
var count = fruits.unshift("apple", "orange"); // 推入两项
console.log(count); //2
count = colors.unshift("lemon"); // 推入另一项
console.log(count); //3
var item = fruits.pop(); // 取得最后一项
console.log(item); //"lemon"
console.log(fruits.length); //2
这个例子创建了一个数组并使用 unshift() 方法先后推入了 3 个值。首先是 "apple" 和 "orange" ,然后是 "lemon" ,数组中各项的顺序为 "lemon" 、 "orange" 、 "apple" 。在调用 pop() 方法时,移除并返回的是最后一项,即 "lemon" 。
IE7 及更早版本对 JavaScript 的实现中存在一个偏差,其 unshift() 方法总是返回 undefined 而不是数组的新长度。IE8 在非兼容模式下会返回正确的长度值。