为什么JavaScript &&运算符返回第二个表达式?

问题描述:

作为每https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators为什么JavaScript &&运算符返回第二个表达式?

的表达式1 || expr2对我有意义。它将表达式短路并返回第一个,这是有道理的。我经常使用它来选择传递的变量与默认的变量。例如。

var default_connection = 'localhost:27017/task_master'; 

function setdb(connection){ 
    var conn_str = connection || default_connection; 
    //Do something here 
} 

&&行为只是打败了我,而且对我来说显得非常难以理解。

expr1 && expr2 - 返回expr1如果它可以转换为false;否则,返回expr2

有人可以帮我理解这个,并建议一些使用案例,其中&&可以是有用的。

编辑:从建议的原始问题找到它。这给了我足够的理由来使用它。

& &有时被称为警卫操作员。

变量=指示器& &值

它可以被用来设置仅当指示器是truthy值。

我的问题是,“有人可以帮我理解这一点,并建议一些使用案例,其中&&可以是有用的。”我不知道这个问题的哪一部分很难理解。我举了一个我如何找到||的例子有用的,以上原因给出了一个足够好的理由如何& &也可以是有用的。是的,我是JavaScript新手,是的,我不像你们一样聪明。但稍微有点儿会帮助我到达那里。和平!

+0

你在代码'&&'中看到了什么? –

+0

@David Haim:代码属于'||'。他总是在问&& &&。请注意,他甚至要求'&&'的例子 - 显然,他不知道任何。 – BoltClock

+0

“为什么JavaScript &&运算符返回第二个表达式?”因为,作为一个逻辑与,为了第二个表达式甚至被认为是第一个必须是真的,否则它会短路。这与||没有什么不同工作 - 当expr1是虚假的,那么它会返回expr2,就像expr1真实时&&所做的那样。 – BoltClock

它停在一个错误的值的值,并返回一个值(我认为这更清楚这种方式)。这对于嵌套对象非常有用。假设你可能有一个这样的对象,但支撑还是nestedProp可能不存在:

var a = { 
    prop : { 
    nestedProp : { 
     hello : 'hello' 
    } 
    } 
} 

现在,如果我们需要检查的nestedProp

字符串里面你不能说:

if(a.prop.nestedProp.hello === 'hello') 

因为propnestedProp可能没有定义,如果你试图做这个检查,你会得到TypeError

所以,你这样做:

if(a.prop &&.prop.nestedProp && a.prop.nestedProp.hello === 'hello') 

这将会是尝试分配hello道具同样的事情:

var hello = a.prop && a.prop.nestedProp && a.prop.nestedProp.hello; 

如果a.prop是不确定它会停在那里和返回undefined。如果它是一个真值,那么它将评估a.prop.nestedProp,如果它是一个虚假值,那么它将返回,否则它返回a.prop.nestedProp.hello

+0

一个很好的例子@MinusFour。感谢分享! –

的短路性质是仲和不太重要的 - 首先||代表逻辑or而& &代表逻辑and

因为两者都是懒惰的,他们可以在结果被清除后停止评估,这是次要行为的来源。当第一个值or为真时,不需要评估第二个值。当第一个值and为假时,不需要评估第二个值。

让我们看看a && b的所有值ab的可能结果。

如果a = falseb = false然后 a && b = false其等于a
如果a = falseb = true然后 a && b = false其等于a
如果a = trueb = false然后 a && b = false其等于b
如果a = trueb = true然后 a && b = true这等于b

所以当afalse,表达a && b将根据其性质返回false。所以如果a如果false我们只需要返回它。

atrue,表达a && b将仅依赖的b值,即,如果trueb = true如果falseb = false。 这意味着在atrue,我们只需要返回b