2016-02-04 143 views
2

我很好奇为什么这个while循环没有按预期打破。我的理解是,当使用OR运算符(||)时,如果发现任何条件为假,则循环会中断。JavaScript While循环条件Abbration

但是,我注意到在一个测试文档中(我第一次学习JS),我的while循环要求所有条件在破坏之前都被发现为假。

这是一个存根例如:

var stringName="", numhours=0, numRate=0; 

document.write("Exit at any time by entering -1"); 
while (stringName != "-1" || numHours != -1 || numRate != -1){ 
    stringName = prompt("Enter name",""); 
    numHours = prompt("Enter num hours",""); 
    numHours = parseFloat(numHours); 
    numRate = prompt("Enter rate per hour",""); 
    numRate = parseFloat(numRate); 
} 

我想它使用户可以输入-1在任何阶段,而一旦循环完成,它会再次重新检查的条件,并经过发现名称不等于“-1”是错误的,或者假设小时不等于-1,或者错误地认为工资不等于-1,它会打破循环。

相反,它似乎循环要求所有这些条件都满足退出,其中名称==“-1”AND小时== -1 AND工资== -1,只有那么它会打破。

任何有识之士将不胜感激。你们好棒!

+0

[|| Java脚本的可能的复制运算符](http://stackoverflow.com/questions/1378619/javascript-operator) –

回答

7

你有你的OR运营商倒退的理解。您正在对待它,如AND

相反的:

这是我的理解,使用或操作时,(||),如果任何一个条件被发现是假,则循环中断。

它实际上

如果任何条件都发现是真的,继续循环。

要解决,你可以重写你的循环是问题:

while (stringName !== "-1" && numHours !== -1 && numRate !== -1) 

而且最好是使用!==而不是!=因为!=做一些奇怪的所谓的强制类型转换,可以给你结果你不没有期待。

+1

这有助于我理解我的错误。顺便说一句,你所有的答案都是有钱的,但是AR7确实帮助我理解了更好的原因。 –

+0

@ AR7你能提供一个例子,其中!=奇怪的事情?谢谢 –

+0

@VietNguyen对不起,没有看到这一点。看看http://stackoverflow.com/questions/359494/does-it-matter-which-equals-operator-vs-i-use-in-javascript-comparisons – m0meni

5

你有它向后。如果任一操作数具有“真值”值(true,非null等),则||运算符评估为true。您的while循环将仅在全部个人不平等测试为false时退出。如果您希望它在的任何false时退出,请改为使用&&运算符。

+0

看看那个。 –

+0

谢谢。这非常有帮助。我不记得C或Java以这种方式工作...... –

+1

@MatthewRyan - C和Java也以同样的方式工作。 –

2

while(condition)将循环,直到condition == false。

当我们测试这个使用控制台你的问题都可以回答: true||false||false||false||true将evaulate到true

因为OR语句评估为true,如果他们的条件之一是真实的。