JavaScript中的&和&&有什么区别?


79

JavaScript中的&和&&有什么区别?

示例代码:

var first  = 123;
var second = false;
var third  = 456;
var fourth = "abc";
var fifth  = true;
alert(first & second); // 0
alert(first & third);  // 72
alert(first & fourth); // 0
alert(first & fifth);  // 1

alert(first && second); // false
alert(first && third);  // 456
alert(first && fourth); // abc
alert(first && fifth);  // true

似乎&&是一个逻辑上的“和”,如果两个都为true,则总是提供第二个值。

但是什么是&?

(顺便说一下,&&在Python中似乎是“ and”;&在Python中似乎是&。)

Answers:


143

& 是按位AND

该运算符期望两个数字并重新调谐一个数字。如果它们不是数字,则将其强制转换为数字。

它是如何工作的?维基百科有一个答案:https : //en.wikipedia.org/wiki/Bitwise_operation#AND

注意:在Javascript中,不建议使用此运算符因为没有整数数据类型,只有浮点数。因此,浮点数在每次操作之前都会转换为整数,从而使其变慢。而且,它在典型的Web应用程序中没有真正的用途,并且会生成无法读取的代码。

一般规则:避免。不要使用它。它很少放在可维护和可读的JS代码中。

&& 是逻辑与

它需要两个参数并返回:

  • 第一项评估为假
  • 否则为最后一项(如果全部为y)

这里有些例子:

0 && false          0 (both are false-y, but 0 is the first)
true && false       false (second one is false-y)
true && true        true (both are true-y)
true && 20          20 (both are true-y)

如果您只在布尔值上使用过它,那么这正是数学逻辑中的AND运算符。

&& 操作员链

如上所述定义此运算符的原因是运算符链接。您可以链接此运算符,并且仍然保留上述规则。

true && 20 && 0 && 100          0 (it is the first false-y)
10 && 20 && true && 100         100 (last one, since all are true-y)

&& 短路

从定义中可以看出,一旦您发现一个术语为假y,就不必关心以下术语。Javascript甚至更进一步,术语甚至都没有评估。这称为短路。

true && false && alert("I am quiet!")

该语句不发出任何警告,false并返回。因此,可以将&&运算符用作if语句的更短替代。这些是等效的:

if (user.isLoggedIn()) alert("Hello!")
user.isLoggedIn() && alert("Hello!")

几乎所有的JS压缩程序都使用此技巧来节省2个字节。


4
&&在JavaScript中不返回布尔值。
Sanghyun Lee 2011年

1
AFAIK,&&如果为false-y,则返回第一个值,否则返回第二个值。
duri 2011年

1
答案完全修改。
Rok Kralj 2014年

如果它返回第一个值,那么我不明白如何运行它: if($('#form1')。parsley()。validate()== true && $('#form2')。parsley() .validate()== true){//如果两种形式都有效,请执行一些操作,因为如果它为false,它将在第一个函数中退出,并且永远不会验证第二种形式,那么如何运行该IF语句?
user991 2014年

1
@ user777如果仅在两次验证时都进行操作,则是否验证第二种形式不是无关紧要的吗?如果第一种形式失败,则整个操作无效。但是,这实际上是一个完全独立的问题,因为此线程只用于返回,而不是使用if语句
瑞安·威廉姆斯

24

&是按位“与”。这意味着,如果您将两个数字转换为二进制,则结果是一个数字,1两个数字都在具有的位置1

  100011  //35
& 111001  //57
---------
  100001  //35 & 57 == 33

-2

要确定放在一起的两个布尔值是true还是false,如果要同时检查这两个布尔值(例如网页上的验证),则可以使用&运算符。&是按位与。

对于&&运算符,一旦发现第一个值是错误的,它将结束评估并且不检查第二个值。


1
使用&布尔值时,请勿使用按位AND()。有关正确使用此运算符的信息,请参阅其他答案。
FtDRbwLXw6 2012年

@drrcknlsn,我阅读了其他答案,但此处的说明效果很好,您能否提供有关您的索赔的更多信息?
azerafati 2014年

1
@Bludream:此答案中的解释是错误的。您不对逻辑(布尔)比较使用按位运算符。您使用逻辑(布尔)运算符。它们执行不同(尽管相似)的操作,期望输入不同,产生不同的输出,并且具有不同的运算符优先级。
FtDRbwLXw6 2014年

1
我同意这是一个不好的做法,但是将&与布尔值一起使用将可以工作。false的结果为0,true的结果为1。我看不到此答案在技术上有任何不正确之处,因为您“可以”使用&,因此不建议这样做。
dyoung

-2

凭借所有详尽而详尽的见解,他们大多都错失了一个事实,即只有单项&才能工作的有条件评估。实用的外行答案解决了我对MULTI链式&&的IF语句字符串以及每个!==跳到一个条件的问题,这导致失败,需要合法使用单个&。我感谢Jake Wayne(和Russ)不公正地投票否决了正确的答案,因为有多个&&!==的地方已经停止了评估,并且在找到第一个评估==!之后不再进行评估。对于&&,它认为在第一次评估显示!== [例如,假]。我失败的代码是

IF ((sessionStorage.myLable !== "LableStringA") && (sessionStorage.myLable !== "LableStringB") && (sessionStorage.myLableZ !== "LableStringA") && (sessionStorage.myLableZ !== "LableStringB")) { ...)

在这里,正确地将&替换为&并使用&既是现实世界中的问题,又是技术上正确的答案。再次感谢Jake Wayne(和Russ)对代码的理解和理解。


1
如果您不了解,我建议您不要使用“仅因为它有效”的方法。当故障最终无法解决并且无法调试时,您只是在为自己设置麻烦。甚至更糟的是,您尝试在求职面试中使用它,他们看起来像ಠ_look。如果您的条件没有评估您的期望,那么您会遇到逻辑错误。如果第一个条件返回假,则没有理由评估所有四个条件,因为在这种情况下,组合条件永远无法评估为真
Brandon

谢谢布兰登。我不怀疑您的整体担忧。我总是遵循并制定===约定。但是,在这里,所有四项评估都是必要的,与您最后的好评论相反。所有四个评估都必须为!==,并在括号内以该格式使用。串联&&不会像预期的那样进行高级逻辑。在我测试的所有主要操作系统上,编译器均正确地使用了&。
GladHeart '19

关于它为何看起来如此且做得很好的后续工作,这将清楚地说明Russ&Jake虚假贬低的答案。所有四个评估都需要评估。当第一个评估为假时,使用&&停止/中止。使用单号&让它继续必然地评估其余三个条件。正如Russ&Jake所说的:“使用“ &&”运算符,一旦发现第一个值是假的,它将结束评估并且不检查第二个值。而“如果要[全部]检查它们(例如网页上的验证),则可以使用“&”运算符。“&”是按位AND”
GladHeart

1
如果您需要检查所有内容,则还可以构建逻辑,if (!(sessionStorage.myLable === "LableStringA" || sessionStorage.myLable === "LableStringB") || !(sessionStorage.myLableZ === "LableStringA" || sessionStorage.myLableZ === "LableStringB")) { // fail validation}这样就可以更清楚地了解您的意图(我假设您要确保myLable的值是两个值之一,否则将通过失败验证) 。除非您的情况有副作用,否则没有理由需要对它们全部进行评估。操作员按预期的方式工作,但您的逻辑却错了
Brandon

请为布兰登做后续工作。相对而言,在我的情况下,仍然缺少条件的必要性,在这种情况下,寻找===可能是四个验证中每种验证的数十种可能性之一。简而言之,如果四个都不包含特定的页面标记值,那么我将回过头来运行脚本以弥补其不足。所有四个必须全部显示为==!。这并不是说“假设要确保myLable的值是两个值之一”,而是myLable实际上是一大堆可能性中的一个。因此,非等效性是单个问题的四倍。
GladHeart
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.