请考虑以下代码。
console.log("All" && 1); // 1
console.log("All" || 1); // "All" ?
如您所见,第一个表达式"All" && 1
正确计算为1
。我希望第二个表达式"All" || 1
也能计算为1
。但是,它的值为"All"
。为什么这样?
在C中,第二个表达式正确计算为1
。
#include <stdio.h>
int main() {
printf("%d\n", "All" && 1); // 1
printf("%d\n", "All" || 1); // 1
return 0;
}
为什么JavaScript的行为有所不同?
答案 0 :(得分:6)
C中的逻辑运算符始终求值为布尔值。在C中,整数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;
}
在上述程序中,即使表达式20 && 10
和20 || 10
中没有1
,它们的结果仍然为1
。这是有道理的,因为这两个表达式在逻辑上都是正确的。因此,它们的计算结果为1
,相当于JavaScript中的true
。
如果JavaScript的行为方式与C相同,则表达式"All" && 10
和"All" || 10
的值将为布尔值true
。但是,这不是逻辑运算符在JavaScript中的行为方式。并不是说他们有越野车。
JavaScript中的值具有真实性和虚假性的概念。例如,值true
,"All"
,10
,[10, 20]
,{ foo: 10 }
和x => 2 * x
都是真实的。另一方面,值false
,""
,0
,undefined
和null
是虚假的。
JavaScript的逻辑运算符并不总是像C那样对布尔值求值。而是,它们求值为其操作数之一。 &&
运算符如果错误,则求值为左操作数。否则,它将计算为正确的操作数。同样,||
运算符如果为真,则求值为左操作数。否则,它将计算为正确的操作数。
现在,值"All"
是真实的。因此,"All" && 1
的计算结果为右操作数(即1
),而"All" || 1
的计算结果为左操作数(即"All"
)。请注意,1
和"All"
都是真实值,这意味着它们等效于C中的1
(代表真实性)。
因此,不。 JavaScript不是越野车。
答案 1 :(得分:-5)
让我们举一些例子,
let a = [1,2,3];
console.log( 0 && a.b ); // return 0
console.log( 1 && a.b ); // return a type error.
因为在第一个console.log中,当JavaScript首先看到0时,它将停止求值并返回第一个值。 因为在逻辑“和”中,如果一个条件为假,则结果为假。 JavaScript通过尽早返回来保存相同的内存。但是在第二种情况下,第一个操作数的值为true。因此,结果取决于第二个操作数。因此,JavaScript巧妙地返回了第二个操作数。如您所见,a.b不存在,因此它返回类型错误。 逻辑||也会发生这种情况或运算符。或如果运算符之一为true,则operator返回true。关于它的问题返回所有字符串。因为任何非空字符串都将评估真值。因此,无需更多检查。因此,只需返回所有字符串。最终,通过类型对话,“所有”字符串变成了真值。