和&之间的区别是什么?和&&在JavaScript?

时间:2011-09-05 15:35:03

标签: javascript bitwise-operators logical-operators

和&之间的区别是什么?和&&在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

好像&&是一个逻辑“和”,如果两者都是真的,它总是给我第二个值。

但是什么是&?

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

4 个答案:

答案 0 :(得分:110)

&是按位AND

此运营商需要两个数字并返回数字。如果它们不是数字,则会转换为数字。

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

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

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

&&是逻辑AND

它需要两个参数并返回:

  • 评估为false的第一个术语
  • 最后一个字词(如果一切都是真实的)

以下是一些例子:

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)

&&短路

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

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

此语句不会提醒任何内容,并返回false。因此,您可以使用&&运算符作为if语句的较短替换。这些是等价的:

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

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

答案 1 :(得分:21)

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

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

答案 2 :(得分:0)

凭借所有崇高而详尽的见解,实用的外行人的答案解决了我的问题,这使我对由四个链接的IF语句字符串跳动了&&导致FAILURE作为IF((sessionStorage.myLable!== “ ...”实际上是在现实世界通过-4下投解决方案(现在显示在下面)解决了,只需使用一个&而不是&&谢谢Jake Wayne(和Russ)即可。注意,在测试我的示例中,如果使用==代替首选的!==

,也可以使用

答案 3 :(得分:-4)

要确定放在一起的两个布尔值是真还是假,如果要同时检查它们(如网页上的验证),您可以使用“&”运营商。 “&安培;”是按位AND。

使用“&&”运算符,一旦发现第一个值为false,它将结束评估而不是检查第二个值。