提问人:Bapi 提问时间:9/2/2019 最后编辑:Bapi 更新时间:7/28/2021 访问量:690
为什么 ||JavaScript 中的 (or) 和 && (and) 运算符的行为与 C 中的行为不同(返回非布尔值)?
Why does the || (or) and && (and) operator in JavaScript behave differently than in C (returning non boolean value)?
问:
请考虑以下代码。
console.log("All" && 1); // 1
console.log("All" || 1); // "All"
如您所见,第一个表达式 的计算结果为 。这肯定不是布尔值(不是 )。我在这里更具体地期望。因为我没有强迫结果。"All" && 1
1
true
String
第二个表达式 , ,计算结果为 。这也不是布尔值。"All" || 1
All
在 C 语言中,both 表达式的计算结果为 。当我强制结果转换为字符串时。1
#include <stdio.h>
int main() {
printf("%d\n", "All" && 1); // 1
printf("%d\n", "All" || 1); // 1
return 0;
}
为什么 JavaScript 的行为不同?更具体地说,为什么 JS 返回非布尔值?
答:
C 语言中的逻辑运算符的计算结果始终为布尔值。在 C 中,int 表示,int 表示 。这就是为什么表达式 和 的计算结果都为 的原因。两者在逻辑上都是正确的。为清楚起见,请考虑以下程序。1
true
0
false
"All" && 1
"All" || 1
1
#include <stdio.h>
int main() {
printf("%d\n", 20 && 10); // 1
printf("%d\n", 20 || 10); // 1
return 0;
}
在上面的程序中,表达式和计算结果仍然为,即使这些表达式中没有。这是有道理的,因为这两个表达式在逻辑上都是正确的。因此,它们的计算结果相当于 JavaScript 中的哪个。20 && 10
20 || 10
1
1
1
true
如果 JavaScript 的行为方式与 C 相同,则表达式 和 的计算结果为 布尔值 。但是,这不是逻辑运算符在 JavaScript 中的行为方式。这并不是说它们是有缺陷的。"All" && 10
"All" || 10
true
JavaScript 中的值具有真实性和虚假性的概念。例如,值 、 、 、 和 都是真实的。另一方面,值 、 、 和 是虚假的。true
"All"
10
[10, 20]
{ foo: 10 }
x => 2 * x
false
""
0
undefined
null
JavaScript 的逻辑运算符并不总是像 C 那样计算为布尔值。相反,它们根据其中一个操作数进行计算。如果操作数是假的,则运算符将计算到其左操作数。否则,它的计算结果为正确的操作数。同样,运算符计算其左操作数是否为真。否则,它的计算结果为正确的操作数。&&
||
现在,这个值是真实的。因此,计算到右操作数(即),而计算到左操作数(即)。请注意,这两个 and 都是真值,这意味着它们等价于 C 中的(表示真值)。"All"
"All" && 1
1
"All" || 1
"All"
1
"All"
1
因此,没有。JavaScript 没有错误。
我在这里引用官方文档:- JS中的逻辑AND
当且仅当一组操作数的所有操作数都为真时,一组操作数的逻辑 AND (&&) 运算符(逻辑连词)为 true。它通常与布尔值(逻辑)值一起使用。如果是,则返回布尔值。但是,&&运算符实际上返回指定操作数之一的值,因此,如果此运算符与非布尔值一起使用,它将返回非布尔值。
让我们举一些例子,
let a = [1,2,3];
console.log( 0 && a.b ); // return 0
console.log( 1 && a.b ); // return a type error.
在第一个控制台 .log 中,当 JavaScript 首先看到时,JS 解释器停止并返回第一个值。0
发生这种情况是因为当 JS 解释器将第一个值转换为布尔值时,它的计算结果为 .我们知道这样一个事实,“在任何&&
运算符上,如果单个值为false,它将返回false
。false
所以这里的JS解释器尝试通过返回之前来节省一些计算能力,而没有完整的语句计算。这很棒。
LOGICAL OR (||) 运算符也是如此。
上一个:F#:不确定如何启动 [已关闭]
下一个:纯 CSS 静态星空 [已关闭]
评论