为什么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新手,是的,我不像你们一样聪明。但稍微有点儿会帮助我到达那里。和平!
它停在一个错误的值的值,并返回一个值(我认为这更清楚这种方式)。这对于嵌套对象非常有用。假设你可能有一个这样的对象,但支撑还是nestedProp可能不存在:
var a = {
prop : {
nestedProp : {
hello : 'hello'
}
}
}
现在,如果我们需要检查的nestedProp
字符串里面你不能说:
if(a.prop.nestedProp.hello === 'hello')
因为prop
和nestedProp
可能没有定义,如果你试图做这个检查,你会得到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
。
一个很好的例子@MinusFour。感谢分享! –
的短路性质是仲和不太重要的 - 首先||
代表逻辑or
而& &
代表逻辑and
。
因为两者都是懒惰的,他们可以在结果被清除后停止评估,这是次要行为的来源。当第一个值or
为真时,不需要评估第二个值。当第一个值and
为假时,不需要评估第二个值。
让我们看看a && b
的所有值a
和b
的可能结果。
如果a = false
b = false
然后 a && b = false
其等于a
如果a = false
b = true
然后 a && b = false
其等于a
如果a = true
b = false
然后 a && b = false
其等于b
如果a = true
b = true
然后 a && b = true
这等于b
所以当a
是false
,表达a && b
将根据其性质返回false
。所以如果a
如果false
我们只需要返回它。
当a
是true
,表达a && b
将仅依赖的b
值,即,如果true
和b = true
如果false
b = false
。 这意味着在a
是true
,我们只需要返回b
你在代码'&&'中看到了什么? –
@David Haim:代码属于'||'。他总是在问&& &&。请注意,他甚至要求'&&'的例子 - 显然,他不知道任何。 – BoltClock
“为什么JavaScript &&运算符返回第二个表达式?”因为,作为一个逻辑与,为了第二个表达式甚至被认为是第一个必须是真的,否则它会短路。这与||没有什么不同工作 - 当expr1是虚假的,那么它会返回expr2,就像expr1真实时&&所做的那样。 – BoltClock