我只是在玩一些JavaScript并拥有以下代码:
function Stack() {
// Wrapper class for Array. This class only exposes the push
// and pop methods from the Array and the length property
// to mimic the a LIFO Stack.
// Instantiate new Array object.
this.stack = new Array();
// Pushes a new value on to the stack.
// @param arg to be pushed.
this.push = function(arg) {
return this.stack.push(arg);
}
// Pops a value from the stack and returns it.
this.pop = function() {
return this.stack.pop();
}
// Get size of the Stack.
this.size = function() {
return this.stack.length;
}
}
var stack = new Stack();
// Push 10 items on to the stack
for (var i = 0; i < 10; i++) {
stack.push(i);
}
for (var i = 0; i < stack.size(); i++) {
console.log(stack.pop());
}
第一部分定义了一个Stack对象,它实际上只是本机Array对象的包装器,但只暴露了一些方法和属性,使其像LIFO堆栈一样。为了测试它,我在底部编写了代码。但是,当我尝试使用stack.size()
在for循环中返回堆栈的当前大小时,循环只迭代5次。然而,如果我将该方法调用的返回值赋给变量并将变量传递给for循环,那么它将迭代正确的次数(10)。为什么是这样?我不能在for循环中使用stack.size()吗?
答案 0 :(得分:1)
当你在循环中使用stack.size()
时,循环迭代5次后,stack.size()
等于5,因为你已经将堆栈弹出了5次,i
也等于5。在下一次迭代中,i大于堆栈的大小,循环最终结束。
答案 1 :(得分:1)
因为for循环中的stack.size()
在每次执行后都要进行测试,因此每次从堆栈中弹出一个元素时,大小都会变小。如果你使用变量,你将在该变量中保存堆栈大小,即使从堆栈弹出该变量也不会改变。
答案 2 :(得分:1)
写它的另一种方法是:
for (var i = 0, l = stack.size(); i < l; i++) {
console.log(stack.pop());
}
写for...loops
IMO的最好方法。
答案 3 :(得分:0)
对于每次迭代,您将删除其中一个对象,并减少数组1的大小。
答案 4 :(得分:0)
另外,为什么不这样做:
this.pop = this.stack.pop;
而不是
this.pop = function() {
return this.stack.pop();
}
对我来说似乎是不必要的关闭?