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

IT技术 javascript bitwise-operators logical-operators
2021-02-09 00:16:21

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

这似乎&&是一个合乎逻辑的and,如果两者都是true.

但什么是&

(顺便说一句,&&似乎是and在 Python 中;&似乎是&在 Python 中)

4个回答

& 按位与

此运算符需要两个数字并返回一个数字。如果它们不是数字,则将它们转换为数字。

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

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

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

&& 是逻辑 AND

它需要两个参数并返回:

  • 第一个评估为假的术语
  • 否则最后一项(如果全部为真-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)

&& 短路

从定义中可以看出,只要你发现一个词是false-y,后面的词就不用关心了。Javascript 甚至更进一步,甚至没有评估这些术语。这称为短路。

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

此语句不会发出任何警告并false返回。因此,您可以使用&&运算符来代替 if 语句。这些是等效的:

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

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

如果它返回第一个值,那么我不明白如何运行它: if ($('#form1').parsley().validate() == true && $('#form2').parsley() .validate() == true) { // 如果两种形式都有效,则做一些事情 }因为如果它为假,它将在第一个函数中退出并且永远不会验证第二个形式,那么如何运行该 IF 语句?
2021-03-23 00:16:21
@ user777 如果您的操作应该只在两个验证时发生,那么是否验证第二个表单是否无关紧要?如果第一个表单失败,则整个操作无效。然而,这确实是一个完全独立的问题,因为该线程完全是关于返回,而不是在if 语句中使用
2021-03-26 00:16:21
答案完全修改。
2021-03-31 00:16:21
&& 在 JavaScript 中不返回布尔值。
2021-04-09 00:16:21
AFAIK,&&如果它是 false-y,则返回第一个值,否则返回第二个值。
2021-04-09 00:16:21

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

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

要确定两个布尔值放在一起是真还是假,如果您想同时检查它们(如网页上的验证),您可以使用&运算符。&是按位与。

使用&&运算符,一旦发现第一个值是假的,它将结束评估并且不检查第二个值。

@drrcknlsn,我阅读了其他答案,但这里的解释非常有效,您能否提供有关您的索赔的更多信息?
2021-03-25 00:16:21
&处理布尔值时不使用按位 AND ( )。请参阅有关适当使用此运算符的其他答案。
2021-04-03 00:16:21
@Bludream:这个答案中的解释是错误的。您不使用按位运算符进行逻辑(布尔)比较。您使用逻辑(布尔)运算符。它们做不同(虽然相似)的事情,期望不同的输入,产生不同的输出,并具有不同的运算符优先级。
2021-04-06 00:16:21
我同意这是不好的做法,但将 & 与布尔值一起使用会起作用。false 计算为 0,true 计算为 1。我没有看到任何技术上不正确的答案,因为您“可能”使用 &,只是不推荐。
2021-04-10 00:16:21

尽管贯穿了所有崇高而详细的见解,但他们大多忽略了一个事实,即有条件评估,只有单个 & 才有效。实用的外行答案解决了我在 MULTIPLE chained && each !== 的 IF 语句字符串上的问题导致 FAILURE 并需要合法使用单个 &。我感谢 Jake Wayne(和 Russ)他们不公平地拒绝投票的答案,因为如果有多个 && !== 它已经停止了它的评估并且在找到第一个评估后不再继续==!。使用 && 它认为它的工作在第一次评估显示 !== [例如。错误的]。我失败的代码是

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

在这里,正确地替换和使用单个 & 代替 && 它实际上在现实世界中和技术上都是正确的答案。再次感谢 Jake Wayne(和 Russ)对代码的洞察力和理解力。

如果你不理解它,我不建议使用“仅仅因为它有效”的东西。当它最终不起作用并且您无法调试它时,您只是在为自己设置麻烦。或者更糟糕的是,您尝试在求职面试中使用它,他们会像ಠ_ಠ一样看待您。如果您的条件没有按照您的预期进行评估,那么您就有了逻辑错误。如果第一个返回 false,则没有理由评估所有 4 个条件,因为在这种情况下组合条件永远不会评估为真
2021-03-21 00:16:21
至于为什么它看起来并且确实有效地工作的后续行动,这将是 Russ&Jake 错误地贬低答案的清晰度。所有四个评估都需要进行评估。当第一次评估为假时,使用 && 停止/中止。使用单个 & 让它继续必要地评估剩余的三个条件。正如 Russ&Jake 所说,“使用“&&”运算符,一旦发现第一个值是假的,它就会结束评估,而不检查第二个值。”。而“如果您想检查它们[全部](如网页上的验证),您可以使用“&”运算符。“&”是按位与“
2021-03-23 00:16:21
如果您需要全部检查它们,您还可以构建您的逻辑,if (!(sessionStorage.myLable === "LableStringA" || sessionStorage.myLable === "LableStringB") || !(sessionStorage.myLableZ === "LableStringA" || sessionStorage.myLableZ === "LableStringB")) { // fail validation}这似乎更清楚您的意图(我假设您想确保 myLable 的值是两个值之一,否则验证失败) . 除非您的病情有副作用,否则您没有理由需要对它们全部进行评估。操作员按预期工作,但您的逻辑被翻转
2021-04-02 00:16:21
Ty 用于跟进 Brandon。就我而言,它仍然忽略了条件的必要性,在我的情况下,寻找 === 可能是四个验证中每一个的数十种可能性之一。简单地说,如果四个中没有一个不包含特定的页面标记值,我会退回到运行脚本来弥补它的缺失。所有四个必须都显示为 ==!。并不是“假设您要确保 myLable 的值是两个值之一”,实际上 myLable 是众多可能性之一。因此,非等价性是一个需要 4 倍的单一问题。
2021-04-03 00:16:21
谢谢布兰登。我不质疑你的整体担忧。我总是遵循并制定 === 约定。然而,在这里,所有四项评估都是必要的,这与您上次善意的评论相反。所有四个评估都必须是 !== 并在括号内以该格式使用。连接 && 不会像预期的那样执行高逻辑。我测试过的所有主要操作系统上的编译器都可以正确读取单个 & 。
2021-04-08 00:16:21