if-then子句中带有&&的冗余条件的目的(和)运营商?

时间:2015-05-08 19:53:01

标签: javascript if-statement operators logical-operators

我不理解以下if-then-else子句,我在一段正在处理的代码中找到它。

prefstocking

为什么变量&&出现在逻辑运算符&&的两边?我认为使用逻辑运算符if (x && y = 1)意味着使用它们,如下所示:{{1}}对我有意义,意思是“如果x等于1且y等于1”,但是使用的是什么意思相同的值两次?

3 个答案:

答案 0 :(得分:2)

第一部分if (prefstocking && ...)检查falsenullundefined,0, NaN 和空字符串的var预处理。 这些都称为"falsy"值。

如果预先加工是"假的"那么它不会大于零,也不需要检查它。

Another answer在javascript中详细介绍了truthy v.falsy。

在这种情况下,如果测试是if (prefstocking > 0)则没有区别,因为它总是会评估与原始结果相同的结果,但是主体通常很有用,特别是为了避免取消引用null或未定义的对象。 / p>

var obj1 = someFunction('stuff', 9); // assume it returns an object
var obj2 = getNullObj(); // assume it always returns null

// this is OK if an object is always returned from the someFunction(...) call
if (obj1.hasData()) { }
// this causes an error when trying to call the .hasData() method on a null or undefined object
if (obj2.hasData()) { }

但是,因为逻辑 &&以及 ||运算符short-circuit,所以这样的测试是安全的:< / p>

if (obj2 && obj2.hasData()) { }

如果第一部分是假的(假的)它不会尝试评估第二部分,因为逻辑真理已经知道 - 如果和是假的。这意味着如果.hasData()为null或未定义,则永远不会调用obj2

如果对象定义但没有.hasData()功能,那么会导致错误。对此进行辩护可能看起来像

if (obj2 && obj2.hasData && obj2.hasData()) { }
// ...or...
if (obj2 && typeof obj2.hasData === 'function' && obj2.hasData()) { }

短路允许您检查并避免故障情况,但检查每个可能的故障可能会使您的代码不可读并且表现不佳;用你的判断力。

答案 1 :(得分:2)

用简单的英文写成,这个测试是:

  

如果预处理是真实的并且其值大于0

但是,因为大多数值都是真实的,所以前面的检查是不必要的。任何第一个条件失败的情况也会在第二个条件下失败。我看到很多开发人员将这些检查写成 extra-sure ,但它告诉我他们根本没有考虑他们正在做什么。

答案 2 :(得分:-1)

其他人指出,阅读此内容的方式是(prefstocking) && (prefstocking > 0)是正确的。第一个条件检查预处理是否真实。第二个条件确保它大于0.现在,为什么还要这么做呢?在这里,我不同意其他答案。

在编程中有些情况我们可能会因为效率而在if then子句中使用冗余条件。在这种情况下,从数学上讲,第一个条件是多余的。也就是说,如果第二个条件为真,则第一个条件也为真。但是,订单很重要。如果口译员检查第一个条件并发现它是假的,则接着是&amp;&amp; amp; (和),那么它不需要进一步测试。它可能不会测试第二个条件(见下面的评论:根据ECMAScript标准,它肯定不会测试第二个条件)。如果检查第一个条件的计算成本较低,例如首先排除空案例,则这可能很有用。 它实际上更高效的细节很难用JavaScript来量化,因为内部通常没有指定,每个JS解释器都以自己的方式工作。

此外,if (x && y == 1)形式的表达式将被解释为&#34;如果x是真实的并且如果y等于1&#34;。你误解了操作的顺序。 &&的双方都有不同的条件。他们不会像英语中的威力一样融入一个条件。如果x和y等于1&#34;这个表达式当然不意味着&#34;确保你已经明白了。