1

キュー オブジェクトを定義し、キューに項目がある間ループしたいとしましょう。

明白な解決策:

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();
}

2番目のJavaScriptの例に示されているこの(正確な)構文を達成することは可能ですか? もしそうなら、どのように?

4

5 に答える 5

1

オブジェクトである必要がありますか?配列を使用してみませんか?

var queue = [array,of,things,to,do];
while (queue.length) {
    var todo = queue.pop();
    //do something to todo
}
于 2012-05-05T10:04:36.117 に答える
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) { 
    ...
}
于 2012-05-05T10:23:54.517 に答える
0

これらのいずれかが機能します:

キューを破棄して、条件付き要件を満たします

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

手動でループから抜け出す

var queue = new Queue();
while (queue) {
  queue.size() ? queue.pop() : break;  
}​
于 2012-05-05T10:29:55.647 に答える
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) {}

于 2012-05-05T10:56:50.033 に答える
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アイデアは、文字列値ではなくブール値を返すようにオーバーライドすることです。

于 2012-05-05T10:39:59.590 に答える