2012-05-05 3 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

@FelixLoether спасибо за это. У меня были сомнения в этом. – 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: Ссылка на объект может вернуть значение «false» только при установке «null» или «undefined».Насколько я вижу, то, что вы пытаетесь, невозможно. –

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()' overriden в прототипе. И ни один из них, похоже, не вызван с 'while (test) {}' clause. –

+0

Какой позор :( –