7

只是一个快速的问题。我找不到与此相关的任何内容,因为我真的不知道如何解释它......但是,如果我使用 && 组合两个布尔值来创建另一个变量,会发生什么?

var is_enabled = isEnabled() && isSupported();

如果 isEnabled() 为 false 而 isSupported() 为 true,它是否等于 false?

4

12 回答 12

32

In Javascript the && and || operators are slightly strange. It depends on if the value is "falsy" (zero, undefined, null, empty string, NaN) or truthy (anything else, including empty arrays).

With && if the first value is "falsy", then the result of the operation will be the first value, otherwise it will be the second value. With || if the first value is "falsy" then the result of the operation will be the second value, otherwise it will be the first value.

Example:

var a = 5 && 3; // a will be 3
var a = 0 && 7; // a will be 0

var a = 1 || 2; // a will be 1
var a = 0 || 2; // a will be 2

This is very useful if you want to replace this:

if (x == null){
  x = 5;
}

With:

x = x || 5;

So in short, if isEnabled() is truthy then is_enabled will be set to whatever isSupported() returns. If isEnabled() is falsy, then is_enabled will be set to whatever that falsy value is.

Also as Robert pointed out, there is short-circuiting:

var x = 5 || infinite_loop();
var x = false && infinite_loop();

In both cases, the infinite_loop() call doesn't happen, since the two operations are short-circuited - || doesn't evaluate the second value when the first value is truthy, and && doesn't evaluate the second value when the first value is falsy.

于 2012-07-18T16:08:42.263 回答
4

结果false && truefalse

于 2012-07-18T16:04:31.703 回答
2

如果 isEnabled() 为 false 并且您使用 && 那么 isSupported() 将永远不会被调用,因为评估会短路。

于 2012-07-18T16:04:41.260 回答
1

如果&&operator 的任何操作数是falsy ( false, 0, null, undefined, NaN, "") ,is_enabled则将分配第一个 falsy 值。

如果 operator 的所有操作数&&都不为falsy,则最后一个操作数将被分配给is_enabled

于 2012-07-18T16:04:57.353 回答
1

只有当 isEnabled 和 isSupported 都为真时,is_enabled 才会设置为真。因此,如果 isEnabled 为 false,并且 isSupported 为 true,则 is_enabled 将为 false。

于 2012-07-18T16:05:00.817 回答
1

是的:

<script type="text/javascript">
function isEnabled() {
    return false;
}

function isSupported() {
    return true;
}

var is_enabled = isEnabled() && isSupported();

alert(is_enabled);  // = 'false'
</script>
于 2012-07-18T16:05:03.860 回答
1

如果两个函数都只返回 true 或 false,那么它就像一个普通的 && 和布尔值一样工作。

1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
于 2012-07-18T16:05:42.010 回答
1

首先,&& 仅当且仅当两个表达式都为真时才为真。

所以回到你的问题,true && false 将等于 false,所以是的。

您也可以尝试使用 firebug 或 chrome 开发人员工具上的控制台功能自己测试这些表达式。

于 2012-07-18T16:06:44.190 回答
0

你能做的就是添加一个单一&的并对这些布尔值应用一个AND操作,使得如果它们都为真,那么is_enabled将是真的。

var is_enabled = isEnabled() & isSupported();

编辑 感谢 Pointy 指出我的语法不正确,这应该适用于 C 语言,我猜我只是感到困惑

于 2012-07-18T16:03:31.743 回答
0

简短回答: 如果第一个不是假的,那么第二个,否则第一个。

示例:如果 isEnabled() 返回 false,false则为结果。

否则,如果 isEnabled() 为真,那么isSupported() 返回的就是结果。

现在falsetrue被用来简化答案,false 可以是任何虚假值。

真值和假值的示例:

变量字符串 = ""; // <-- 假的

varfilledString = "这里有一些字符串"; // <-- 真实的

变量零 = 0; // <-- 假的

var numberGreaterThanZero // <-- 真实

var 空数组 = []; // <-- 真的,接下来我们将进一步探讨

var 空对象 = {}; // <-- 真实的

于 2019-08-08T09:22:58.000 回答
0

在这里,您可以看到可能的测试案例有哪些:

var str='My dummy string';
var str2='My other dummy string';
var falsy1= 1==2;
var truthy1= true;
var truthy2= true;
var falsy2= false;

然后:

console.log('Both bool true:', truthy1 && truthy2); // <== Both bool true: true
console.log('Bool true and string:', truthy1 && str); // <== Bool true and string: My dummy string
console.log('String and bool true:', str && truthy1); // <== String and bool true: true
console.log('Falsy operation and string:', falsy1 && str); // <== Falsy operation and string: false
console.log('Bool false and string:', falsy2 && str); // <== Bool false and string: false
console.log('Both bool false and true:', falsy1 && truthy1); // <== Both bool false and true: false
console.log('Both bool true and false:', truthy1 && falsy1); // <== Both bool true and false: false
console.log('Operation false and bool true:', falsy2 && truthy1); // <== Operation false and bool true: false
console.log('Operation false and bool false:', falsy2 && falsy1); // <== Operation false and bool false: false
console.log('Both strings:', str2 && str); // <== Both strings: My dummy string
console.log('Both strings:', str && str2); // <== Both strings: My other dummy string   
console.log('String and bool false:',  str && falsy1); // <== String and bool false: false  
console.log('String and 2 bool false and true:',  str && falsy1  && truthy1); // <== String and 2 bool false and true: false
console.log('3 bool false and true and true:',  falsy1 && truthy1 && truthy2); // <== 3 bool false and true and true: false
console.log('3 bool false and false and true:',  falsy1 && falsy1 && truthy1); // <== 3 bool false and false and true: false
console.log('Bool false and operation false and bool true:',  falsy1 && falsy2 && truthy1); // <== Bool false and operation false and bool true: false
console.log('3 bool true and true and false:',  truthy2 && truthy1 && falsy1); // <== 3 bool true and true and false: false
console.log('String and 2 bool false and true:',  str && falsy1 && truthy1); // <== String and 2 bool false and true: false
console.log('String and 2 bool true and false:',  str && truthy1 && falsy1); // <== String and 2 bool true and false: false
console.log('2 bool false and true and string:',   falsy1 && truthy1 && str); // <== 2 bool false and true and string: false
console.log('2 bool true and false string:',  truthy1 && falsy1 && str); // <== 2 bool true and false string: false
console.log('Bool true and string and bool false:',  truthy1 && str && falsy1); // <== Bool true and string and bool false: false
console.log('Bool false and string and bool true:',  falsy1 && str && truthy1); // <== Bool false and string and bool true: false

和奖金:

console.log('The existence of a string:',  !!str); // <== The existence of a string: true
于 2018-02-02T12:45:27.080 回答
-3

成功的布尔运算(例如“&&”)的结果是一个布尔值。因此,结果isEnabled() && isSupported()将是一个布尔值,然后将其分配给 is_enabled

于 2012-07-18T16:06:28.930 回答