我正在阅读一个代码,该代码展示了如何使用逻辑&&运营商制作“if”声明。
someBoolean && (someStatement = 10);
等于:
if(someBoolean) {
someStatement = 10;}
我知道如何&&作品。但我无法理解它在这个例子中是如何工作的。
&安培;&安培;运算符的工作方式如下:如果第一个值为false,则返回它,否则它将搜索,直到找到false值。如果不是,则返回最后一个值。
在此示例中,如果someBoolean为false,则返回“someBoolean”!否则将返回“(someStatement = 10)”部分。
但它恰恰与“如果”相反。不是吗?
答案 0 :(得分:5)
但它恰恰与“如果”相反。不是吗?
不,结果与if
语句具有相同的效果。
如果第一个操作数(someBoolean
)为false,则该值用于整个表达式,第二个操作数(someStatement = 10
)不计算,因为它不需要。
如果第一个操作数为true,则必须计算第二个操作数以确定整个表达式的值。
答案 1 :(得分:4)
使用逻辑语句的关键是理解Short-circuit Evaluation(您在问题中提到的)。确切地说,没有任何“返回” - 但我认为你的意思是“被评估” - 但由于结果没有被捕获,这个评估将会丢失。
但这种对“if”的方法对最终结果不感兴趣,它只是使用短路评估,以便在第一部分为真时有条件地评估表达式的第二部分。
所以,举个例子:
x && (y = 10)
:如果x为真,则仅为y指定10 x || (y = 10)
:如果x为假,则仅为y指定10 !x || (y = 10)
:如果x为真,则仅为y指定10 这种风格当然难以阅读,所以一般不建议使用源代码。虽然我经常在缩小的代码中看到它,因为它可以保存几个字符。
答案 2 :(得分:2)
在第一个表达式求值为true,第二个表达式被评估之后,它就像if一样。与此相反,如果第一个exprssion的计算结果为false,则不会计算第二个表达式。在下面的示例中,b的值从未分配,因为第二个if以false&&开头。您将在第二个警报中看到“未定义”。
var a;
if(true && (a = 10))
alert(a) //alerts 10
var b;
if(false && (b = 5))
alert(b) //never alerts b/c of the false above
alert(b); //alerts undefined b/c (b = 5) is never evaluated
答案 3 :(得分:1)
如果someBoolean
为真,则表达式的其余部分将进行评估,即(someStatement = 10)
。
if
语句不会“返回”值,而是评估。
此方法忽略表达式的结果,这很好。
我不会用它;这是一个更多的认知开销。不过,这只是一种意见。