在 JavaScript 中 & 和 & & 之间有什么区别?

在 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,它总是给我第二个值。

但什么是 &

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

113203 次浏览

&是按位 AND

This operator is 几乎没用过 in JavaScript. Other programming languages (like C and Java) use it for performance reasons or to work with binary data. In JavaScript, it has questionable performance, and we rarely work with binary data.

这个操作符期望 两个数字并返回一个 号码。如果它们不是数字,它们就被转换为数字。

它是如何工作的呢? 维基百科给出了一个答案: https://en.Wikipedia.org/wiki/bitwise_operation#and

&&是逻辑和

最常见的情况是,程序员使用这个操作符检查两个条件是否都正确,例如:

true && true        // returns true
true && false       // returns false

然而,在 JavaScript 中,它被扩展为允许任何数据类型和任意数量的术语:

  • 第一个计算结果为 false 的术语
  • 否则的最后一项(如果都为 true-y)

Here are some examples:

true && false && true         // returns false
true && 20 && 0 && false      // returns 0 (it is first false-y)
10 && "Rok" && true && 100    // returns 100 (as all are true-y)

&&短路

从上面可以看到,一旦你发现一个术语是 false-y,你就不需要关心下面的术语了。这允许 Javascript 完全停止求值。这叫做短路。

该语句不会警告任何事情,返回 false:

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

因此,您可以使用 &&运算符作为 if 语句的一个更短的替换:

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

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

&是位“ and”。这意味着,如果有两个数字转换为二进制,结果是在两个数字都有 1的位置上都有一个 1数字的数字。

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

To determine whether two boolean values put together are true or false, if you want to check them both (like validation on the web page), you may use the & operator. & is bitwise AND.

对于 &&操作符,一旦发现第一个值为 false,它将结束计算,而不检查第二个值。

伴随着所有崇高的,详细的洞察力贯穿始终,他们大多忽略了这样一个事实: 有条件的评估,只有单身和将工作。实用的外行人的答案,解决了我的头敲击一个 IF 语句字符串多链 & & 每!= = 到一个导致失败的条件,需要合法使用单 & 。我感谢杰克韦恩(和拉斯) ,他们不公平的投票否决的答案,得到了正确的考虑到有不止一 & & & 那!已停止评估,找到第一次评估后不再继续评估!.与 & & 它认为它的工作是完成后,第一次评估显示!= = [例如,错误]。我的失败代码是

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

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