JavaScript 中是否有逻辑与运算符?

6
我想知道Javascript中是否有"&"逻辑运算符。我在Firebug(Firefox)中尝试运行1 & 0和1 && 0,两者都返回了0。
有人告诉我C#接受&和双重&&,双重&&更有效率,因为它会在遇到false时立即退出比较循环,但我没有找到任何关于Javascript的信息。
有什么想法吗?

尝试一下 1 && 1,这能够向你展示实际发生了什么...? - MvanGeest
1 && 1 返回 1,而 1 & 1 也返回 1。 - DLS
https://dev59.com/4m855IYBdhLWcg3wGQTY - Bergi
8个回答

10

“&”是位运算符中的按位与操作符。在Javascript中,“&&”是唯一的逻辑与操作符。


2
它类似于逻辑“AND”运算符,但与其他语言不同的是,除非其操作数为布尔值,否则它不会产生布尔结果值。 - Pointy

5
&& 运算符返回 0,因为它在 JavaScript 中的语义与其他类 C 语言中的运算符不同(尽管其符号相同)。在 JavaScript 中,&& 运算符只对操作数进行布尔值转换,仅用于求值目的。表达式的结果形式如下:
e1 && e2 && e3 ...

实际值是第一个子表达式en的强制布尔值为false。如果它们都被强制转换为布尔值,则结果是最后一个en实际值。同样地,||运算符解释如下表达式:

e1 || e2 || e3 ...

通过返回第一个强制转换为布尔值为真的en实际值来实现。如果它们都为假,则该值为最后一个的实际值。
这些描述中隐含的事实是,无论是&&还是||一旦满足完成条件,就会停止评估子表达式。

3

1 & 0 是 0。

这是位运算符,不是逻辑运算符。

&& 表示左右操作数的逻辑 AND。这意味着只有当左右操作数都解析为布尔值 true 时,它才会返回一个布尔值 true。

& 表示左右操作数的按位 AND。这意味着将比较每个操作数的位,并且结果将是按位 AND 的值,而不是布尔值。如果执行 101 & 100,返回值是 100。如果执行 1 & 0,返回值是 0

如果有人告诉你两个运算符的区别仅在于效率,那么他们误导了你。它们有非常不同的用途。


关于 && 的说法并不完全正确。表达式 "hello" && 0 返回的是 0,而不是 false,表达式 "hello" && "world" 返回的是 "world",而不是 true - Pointy
我了解JavaScript的行为与我所描述的不同,但我更关心逻辑AND和按位AND之间的区别(以及它们在“大多数”语言中的行为)。 - Jonathon Faust
在这两个方面都是正确的。无论如何,值得注意的是JavaScript的&&||运算符返回truthy/falsy值,不一定是布尔值。它们也像C#的合并运算符?? http://msdn.microsoft.com/en-us/library/ms173224.aspx &&将返回第一个falsey值或最后一个truthy值;||将返回第一个truthy值。 - Justin Johnson

2

关于C#,你的朋友是错误的。

C#不会混淆逻辑运算符和位运算符,所以不能在需要使用&&时使用&,反之亦然。

1 & 0返回0

true && false返回false

因此,如果您正在编写需要布尔值的if语句,则必须使用&&。如果您正在进行位运算,则需要使用&。


有趣。Java确实允许使用&|进行布尔运算,在这种情况下它们存在的目的是为了避免短路。 - Pointy

1

1

0

&& 是 Javascript 中的逻辑运算符。1 && 0 应该返回 false,所以它的表现是正确的。


不是那个。我在问一个单独的&运算符。 - DLS

0
Javascript有位运算符(&)和布尔运算符(&&)。&&返回1&&0的原因是0表示false,所以1(true)&&0(false)返回false,因为两个运算符都必须评估为true才能返回true。

但是为什么要返回“0”而不是“false”呢? - James Curran
这是正确的,但它不会返回“false”,而是返回第一个表达式的实际值,当强制转换为布尔值时为false - Pointy
@James Curran 因为在JavaScript中,&&||与C、Java等语言中的类似运算符是不同的。除非处理布尔子表达式,否则它们不会返回布尔结果。 - Pointy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接