Answers:
是的,JavaScript具有“短路”评估。
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
Short-circuit
该逻辑运算符不可能存在。自己尝试一下。使用我的演示。
这个答案详细介绍了如何 短路如果您正在寻找一种快速定义并且已经了解短路的工作原理,则可以在JavaScript中使用所有陷阱以及相关主题(例如运算符优先级)在JavaScript中工作,我建议您检查其他答案。
首先,让我们在if()
块中检查我们熟悉的行为,在其中&&
检查两件事是否是true
:
if (true && true) {
console.log('bar');
}
现在,您的第一个直觉可能是:“是的,很简单,如果代码同时执行expr1
且expr2
被评估为true
'
好吧,是的,不是。您在技术上是正确的,这就是您所描述的行为,但这并不是评估代码的方式,我们需要更深入地研究才能完全理解。
&&
和的确切||
解释是:是时候看起来“在 javascript 引擎”。让我们考虑这个实际示例:
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
结果是260
..但是为什么呢?为了获得答案,我们需要了解短路评估的工作原理。
通过MDN定义 ,
&&
操作符将在expr1 && expr2
以下执行:如果
expr1
可以转换为true
,则返回expr2
; 否则,返回expr1
。
因此,这意味着在我们的实际示例中,将const res
通过以下方式评估:
expr1
-sanitise(0xFF)
0xFF
是250的有效十六进制数,否则我将返回 NaN
expr1
返回“truthy”值,执行时间expr2
(否则我会停止为NaN
是falsy)userinput
是truthy(数字),我可以添加+5
到它因此,在这里,我们可以通过简单地使用运算符来避免其他if
块并进一步isNaN
检查&&
。
到现在为止,我们至少应该了解一下 短路操作员的工作。通用规则是:
(some falsy expression) && expr
将评估为虚假的表达(some truthy expression) || expr
将评估为真实表达以下是进一步理解的一些示例:
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
很好,希望您能掌握一切!我们需要知道的最后一件事是关于运算符优先级的规则,即:
&&
运营商总是先于执行的||
操作。考虑以下示例:
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
这将以的形式返回,也许会使某些人感到困惑a()
。原因很简单,只是我们的目光在欺骗我们,因为我们习惯于从左到右阅读。让我们拿走console.log()
和不拿走,只专注于评估
true || false && false
现在,您可以解决这个问题:
我们说过&&
运算符具有优先权,因此它首先被评估。为了帮助我们更好地想象评估,请考虑一下定义
expr1 && expr2
哪里:
expr2
是 false
expr1
是 true || false
因此这是棘手的部分,现在true || false
进行评估(的expr1
-左侧&&
)。
||
运算符,如果expr1 || expr2
in expr1
评估为“真”,则停止执行,然后expr1
执行并停止执行代码。返回值是 true
嗯..这很棘手,这都是因为很少有奇怪的规则和语义。但是请记住,您总是可以使用()
- 来转义运算符的优先级,就像在数学中一样
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1
和expr2
/ condition1
或其他任何东西,这只是令人困惑。确定一个,您也可以引入局部变量,例如。const expr1 = true; if(expr1 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%s
为搜索快捷方式(Chrome / Firefox),以加快搜索速度。