2015-06-14 120 views
1

我正在阅读代码,该代码显示如何使用逻辑运算符“if”语句运算符。如果语句没有if if

someBoolean && (someStatement = 10); 

等于:

if(someBoolean) { 
someStatement = 10;} 

我知道如何& &作品。但在这个例子中,我无法理解它是如何工作的。

& &运营商是这样的:如果第一个值是假的,它会被退回,否则它会搜索,直到它找到一个错误值。如果不是,则返回最后一个值。

在此示例中,如果someBoolean为false,则将返回“someBoolean”!否则“(someStatement = 10)”部分将被返回。

但它恰恰与“如果”相反。不是吗?

+3

是的,这是一个不太可读的方式来做到这一点。如果左侧为真,则逻辑AND运算符仅进入右侧。 – adeneo

+0

你没看完我的问题! –

+0

@AmirJalilifard也许,但我认为你并没有完全探索adeneo的说法。这只是一个表达,恰好有一方面的任务。 –

回答

5

但它恰恰与“如果”相反。不是吗?

不,结果与if声明具有相同的效果。

如果第一个操作数(someBoolean)为假,那么该值将用于整个表达式,并且第二个操作数(someStatement = 10)不会被评估,因为它不是必需的。

如果第一个操作数为真,则必须对第二个操作数进行求值以确定整个表达式的值。

1

如果someBoolean为真,则表达式的其余部分将进行评估,即(someStatement = 10)

值不是由if声明“返回”,它们是评估

该方法忽略了表达式的结果,这很好。

我不会使用它;这是更多的认知开销。虽然这只是一个意见。

2

它的工作原理类似于if,因为在第一个表达式评估为true之后,第二个评估为true。与此相反,如果第一个exprssion评估为false,则不会评估第二个表达式。在下面的例子中,b的值永远不会被分配,因为第二个if以虚假& &开头。您将在第二次提醒中看到“未定义”。

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

4

使用逻辑语句的关键是理解Short-circuit Evaluation(你在你的问题暗示)。确切地说,没有什么是“返回” - 但我认为你的意思是“评估” - 但由于结果没有被捕获,这个评估将会丢失。

但是这种对“if”的方法对最终结果不感兴趣,它只是使用短路评估来有条件地评估表达式的第二部分,如果第一部分为真。

因此,一些例子:

  • x && (y = 10):只分配10到y如果x是真实的
  • x || (y = 10):只分配10到y如果x是假
  • !x || (y = 10):只分配10到y如果x是真的

这种风格当然很难读,所以一般不推荐用于源代码。尽管我经常用缩小的代码来看它,因为它可以节省几个字符。

+0

很好的解释,特别是包括短路评估,缩小代码和示例。 – ThisClark