2012-05-05 49 views
1

假设我们已经定义了一个队列对象,并且我们希望在队列中有项目时进行循环。在条件内评估对象false

显而易见的解决方案:

var queue = new Queue(); 
// populate queue 
while (queue.size()) { 
    queue.pop(); 
} 

所需形式:

var queue = new Queue(); 
// populate queue 
while (queue) { // should stop when queue's size is 0 
    queue.pop(); 
} 

是否有可能实现这一点(精确)的语法在第二示例中的JavaScript显示?如果是这样,怎么样?

+0

你为什么要这么做?你必须破坏你的对象才能达到这个目的,因为对象总是很真实,所以你必须将它设置为null或undefined。 – Christoph

回答

0

是否有可能实现这一目标(精确)语法

我的回答是:不。

我尝试以下解决谜题,它似乎并没有工作。
但我认为这是一条路。

声明:这只是一些难题解决,而不是现实世界的代码。

var Queue = function() {}; 
Queue.prototype.sizeValue = 2; 
Queue.prototype.size = function() 
{ 
    return this.sizeValue; 
}; 
Queue.prototype.pop = function() 
{ 
    // EDIT: yes, it's not popping anything. 
    // it just reduces size to make toString() 
    // and valueOf() return nulls. 
    this.sizeValue -= 1; 
}; 
Queue.prototype.valueOf = function() 
{ 
    if (this.size() > 0) { 
     return this.sizeValue; 
    } 
    return null; 
}; 
Queue.prototype.toString = function() 
{ 
    if (this.size() > 0) { 
     return "Queue["+this.sizeValue+"]"; 
    } 
    return null; 
}; 


var test = new Queue(); 
while (test) { 
    test.pop(); 
    if (test.size() < -1) { 
     // just to get you out of the loop while testing 
     alert("failed"); 
     break; 
    } 
} 
alert("out:"+test); 

内toString()和的valueOf()将警报看到,他们没有得到由条件while (test) {}触发。

+0

没有进一步的测试我会:你错了,如果你的pop()返回的值只要有,并且如果不是通过obj = undefined或null破坏对象,就有可能。 – Christoph

+0

Emm ......什么?))当然,这不是一个真正的队列。这个'pop()'方法不会从任何地方弹出任何东西。这只是为了模仿行为。 –

+0

我的意思是,我测试了它,它按我的意思做了。代码可能看起来很愚蠢,但是这里的要点是测试是否触发了某些东西在'while(object)'子句中评估对象。答案是否定的。因此,我得出结论,最初问题的答案是否定的。 –

1

它必须是一个对象吗?为什么不使用数组?

var queue = [array,of,things,to,do]; 
while (queue.length) { 
    var todo = queue.pop(); 
    //do something to todo 
} 
+0

我以队列为例 - 真实的对象比这更复杂。而不是排队,最好是沿着它的一堆思考。 – Macobo

+1

一个空的数组是一个真值(因为它是非空的),所以这是一个无限循环。 –

+0

@FelixLo​​ether谢谢你。我对此有所怀疑。 – Joseph

0
var MyClass = function(){ 

    this.CanOperate; 
    //value should be false when nothing can be done with this class instance 
}; 


Use var obj = new MyClass(); 

while (obj.CanOperate) { 
    ... 
} 
+0

请参阅我的相关答案以使用自定义对象。 http://stackoverflow.com/a/10401601/448232免责声明:可能不会直接有助于您的问题。 –

+0

我想我的问题还不够清楚。我希望问的是,是否可以定义我的类,以便第二个代码可以在没有更改的情况下工作。 :)我会尽力澄清我的问题。 – Macobo

+0

@Macobo:只有在设置为null或undefined时,对象的引用才能返回“falsey”值。据我所知,你所尝试的是不可能的。 –

0

这些要么将工作:

摧毁队列从而满足条件要求

var queue = new Queue(); 
while (queue) { 
    queue.size() ? queue.pop() : queue = null; 
}​ 

手动中断循环的

var queue = new Queue(); 
while (queue) { 
    queue.size() ? queue.pop() : break; 
}​ 
0

像这样的东西应该工作:

function Queue() {} 
Queue.prototype.toString = function() { 
    // I'm using "this.queue" as if it were an array with your actions 
    return !!this.queue.length; 
}; 

var queue = new Queue(); 

// Populate queue 

while (queue) { 
    queue.pop(); 
} 

的想法是覆盖toString不返回一些字符串值,而是一个布尔值。

+0

这个想法非常简单。唯一不好的是它不起作用(在FF和IE中测试)。我刚刚尝试在原型中创建一个带'toString()'和'valueOf()'覆盖的类。他们都没有被'while(test){}'子句调用。 –

+0

真是耻辱:( –