我遇到了以下逻辑运算符解决方法,但无法理解背后的逻辑:
console.log(1 && 2)
会给你2
console.log(false && X)
会给你false
console.log(true && X)
会给你UncaughtReferenceError:X is not defined
任何人都可以解释答案吗?
答案 0 :(得分:4)
查看&&
运算符的documentation:
<强>&安培;&安培; 强>;如果可以转换为false,则返回expr1;否则,返回expr2。因此,当与布尔值一起使用时,&amp;&amp;如果两个操作数都为真,则返回true;否则,返回false。
在第一个示例中,您提供数字1和2作为操作数。 1无法转换为false
,因此返回第二个操作数,恰好为2。
最后两个例子非常简单,因为涉及到布尔值。如果任一操作数为false,则返回false
。只有第三个给出错误的原因是因为在第二个中,第二个操作数(X
)从不会因为短路而被检查。短路意味着一旦JS看到第一个值是false
,它甚至都不会检查另一个值。 JS将false
视为第一个操作数并立即返回。
答案 1 :(得分:1)
请考虑以下声明:A && B
。 &&
运算符在此处执行的操作仅返回A
,如果其值为false
,则返回B
。这就是AND运算符在JavaScript和大多数其他语言中的工作原理。
所以这解释了前两行代码。在第三行中,语句应返回此处为B
的{{1}}变量。但是X
似乎是一个未声明的变量,因此控制台会引发错误。
答案 2 :(得分:1)
在JavaScript中,有一些真实和虚假的价值观。虚假值是
false
0
(数字为零),""
或''
(空字符串),undefined
和null
。所有其他值都是真实的。
这就是&&
运算符在JavaScript 中的的工作方式:
让我们来看看你的例子:
1
中的1 && 2
是真实的,因此评估2
并将其作为表达式的值返回。
false
中的false && X
是假的,因此它将作为表达式的值返回。第二个操作数(X
)将不会被评估。
true
中的true && X
是真实的,因此会评估第二个操作数,这会引发错误,因为没有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'
&#13;