Javascript if then条款中冗余条件的目的&;(及)接线员?

Javascript if then条款中冗余条件的目的&;(及)接线员?,javascript,if-statement,operators,logical-operators,Javascript,If Statement,Operators,Logical Operators,我不理解下面的if-then-else子句,这是我在一段代码中发现的 if (prefstocking && prefstocking >0) { ... } else { ... } 为什么变量prefstocking出现在逻辑运算符&&的两侧?我认为使用逻辑运算符&意味着同时使用这两个运算符,如下所示:if(x&&y=1)对我来说是有意义的,意思是“如果x=1,y=1”,但是两次使用相同的值有什么意义呢?第一部分if(prefstocking&&…检查

我不理解下面的if-then-else子句,这是我在一段代码中发现的

if (prefstocking && prefstocking >0) {
    ...
} else {
    ...
}
为什么变量
prefstocking
出现在逻辑运算符
&&
的两侧?我认为使用逻辑运算符
&
意味着同时使用这两个运算符,如下所示:
if(x&&y=1)
对我来说是有意义的,意思是“如果x=1,y=1”,但是两次使用相同的值有什么意义呢?

第一部分
if(prefstocking&&…
检查var prefstocking的值是否为
false
null
未定义
,0,NaN和空字符串。 这些都称为值

如果prefstocking是“falsy”,那么它不大于零,并且不需要检查

关于truthy v的一些细节。javascript中的falsy

在这种情况下,如果测试是
if(prefstocking>0)
,则没有什么区别,因为这将始终得到与原始测试相同的结果,但主体通常很有用,尤其是为了避免取消引用null或未定义的对象

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()) { }
但是,由于逻辑and和or运算符是安全的:

if (obj2 && obj2.hasData()) { }
如果第一部分是假的(falsy),它不会尝试评估第二部分,因为逻辑真理已经知道了——如果and的第一部分是假的,那么整个陈述都是假的。这意味着如果
obj2
为null或未定义,则永远不会调用
.hasData()

如果定义了一个对象,但没有
.hasData()
函数,则仍然会导致错误。针对这一点进行辩护可能看起来像

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

短路允许您检查和避免故障情况,但检查每一个可能的故障可能会使您的代码无法阅读,并且性能不佳;运用你的判断。

用通俗易懂的英语书写,测试内容如下:

如果预库存是真实的且其值大于0


但是,因为大多数值都是真实的,所以前一个检查是不必要的。任何不符合第一个条件的情况也会不符合第二个条件。我看到许多开发人员编写此类检查是为了更加确定,但它告诉我,他们根本没有考虑自己在做什么。

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

在编程中,出于效率考虑,我们可能会在if-then子句中使用冗余条件。在这种情况下,从数学上讲,第一个条件是多余的。也就是说,如果第二个条件为真,那么第一个条件也为真。然而,秩序很重要。如果解释器检查第一个条件并发现它为false,然后是&&(and),则不需要进一步测试。而且它可能不会测试第二个条件(参见下面的注释:根据ECMAScript标准,它肯定不会测试第二个条件)。如果检查第一个条件的计算成本较低,例如首先排除空情况,那么这可能很有用。使用JavaScript很难量化它是否实际更高效的细节,因为内部常常没有指定,而且每个JS解释器都以自己的方式工作


此外,形式为
if(x&&y==1)
的表达式将被解释为“if x是真的,if y等于1”。你误解了行动的顺序。
和&
的两侧都有单独的条件。它们不像英语中的强项那样结合成一种条件。这个表达式当然不是指“如果x和y等于1”。确保您已经理解了这一点。

prefstocking&&prefstocking>0
表示
(prefstocking)&&prefstocking>0)
。因此,它正在检查以确保预库存不是错误的,并且它大于0。似乎reasonable@wolffer-东部,但
([false | 0 | undefined | null |“”)>0)
为false;为什么还要费心检查错误?@Mathletics,因为我从来没有实际测试过
([false | 0 | undefined | null |]>0)
。现在它似乎一点也不合理:)。需要注意的是,条件的逻辑分离仍然很重要,这两个条件同时存在的有效性notwithstanding@wolffer-这是我的观点;人们用这些东西来编写代码是因为他们没有逻辑地思考发生了什么。这里的其他人似乎忽视了这样一个事实,即如果第一个测试失败,那么解释器甚至不需要检查第二个条件,而且可能不会。尽管额外条件在数学上可能是冗余的,但由于计算顺序的原因,首先包含冗余的简单检查以提高效率可能仍然是有价值的。它检查的不仅仅是变量是否存在(已定义),如
null
0
“exist”。看起来他们更像是在检查值是否为
0
,然后继续检查它是否为非负(尽管这是推测)。@RobM。但在一个表达式中,有什么意义?如果条件是嵌套的,则可能是合理的。但是在一个表达式中,
a>0
告诉你
a&&a>0
会告诉你的一切;我刚才指出,条件检查的不仅仅是变量是否定义。@RudePeopleStepOff这很容易进行基准测试,但听起来像是一个荒谬的微观优化。在这个例子中,优化的大小与此无关。难道我们不想写一些答案,这些答案可能不仅仅对这个特定的人有帮助吗