【问题标题】:Logical Operators (AND Operators)逻辑运算符(AND 运算符)
【发布时间】:2017-10-01 13:20:49
【问题描述】:
我遇到了以下逻辑运算符的解决方法,但无法理解背后的逻辑:
console.log(1 && 2) 会得到你2
console.log(false && X) 会得到你false
console.log(true && X) 会得到你UncaughtReferenceError:X is not defined
谁能解释一下答案?
【问题讨论】:
标签:
javascript
logical-operators
【解决方案1】:
查看documentation 中的&& 运算符:
&&;如果可以转换为 false,则返回 expr1;否则,返回 expr2。因此,当与布尔值一起使用时,如果两个操作数都为真,则 && 返回真;否则,返回 false。
在第一个示例中,您提供数字 1 和 2 作为操作数。 1 无法转换为false,因此返回第二个操作数,恰好是 2。
最后两个示例相当简单,因为涉及布尔值。如果任一操作数为假,您将返回false。只有第三个给你一个错误的原因是因为在第二个中,第二个操作数(X)由于短路而从未被检查过。短路意味着一旦 JS 看到第一个值是false,它甚至都懒得去检查另一个值。 JS 将false 视为第一个操作数并立即返回。
【解决方案2】:
因此请考虑以下语句:A && B。 && 运算符在这里所做的是返回 A 仅 如果它的值是 false 否则它返回 B。这就是 AND 运算符在 JavaScript 和大多数其他语言中的工作原理。
所以这解释了前两行代码。在第三行中,该语句应返回 B 变量,即此处的 X。但是X 似乎是一个未声明的变量,因此控制台会引发错误。
【解决方案3】:
在 JavaScript 中,有真值和假值。虚假值是
false
-
0(数字零),
-
"" 或 ''(空字符串),
-
undefined 和 null。
所有其他值都是真实的。
这就是&& 运算符的工作原理在 JavaScript 中:
- 计算第一个操作数。如果结果是假值,则返回该值。
- 否则,计算第二个操作数并返回其值。
让我们看看你的例子:
1 && 2 中的1 是真的,所以2 被计算并作为表达式的值返回。
false && X 中的false 是假的,所以它作为表达式的值返回。不会计算第二个操作数 (X)。
true && X 中的true 为真,因此计算第二个操作数,这会引发错误,因为没有X。
如果您想拥有一个备用值,此行为非常有用:
function logName (options) {
const name = options.name || 'Default name';
console.log(name);
}
logName({ name: 'foo' }); // logs 'foo'
logName({ name: '' }); // logs 'Default name'
logName({}); // logs 'Default name'