JavaScript是否有;短路“;评价

JavaScript是否有;短路“;评价,javascript,short-circuiting,short-circuit,Javascript,Short Circuiting,Short Circuit,我想知道JavaScript是否具有类似于C#中的&&运算符的“短路”求值。如果没有,我想知道是否有一种解决方法值得采用。是的,JavaScript有“短路”评估 if (true == true || foo.foo){ // Passes, no errors because foo isn't defined. } 这个答案非常详细地介绍了如何在JavaScript中工作,以及所有的问题和相关主题,如运算符优先级,如果您正在寻找一个快速定义,并且已经了解短路是如何工作的,我建议

我想知道JavaScript是否具有类似于C#中的&&运算符的“短路”求值。如果没有,我想知道是否有一种解决方法值得采用。

是的,JavaScript有“短路”评估

if (true == true || foo.foo){
    // Passes, no errors because foo isn't defined.
}


这个答案非常详细地介绍了如何在JavaScript中工作,以及所有的问题和相关主题,如运算符优先级,如果您正在寻找一个快速定义,并且已经了解短路是如何工作的,我建议检查其他答案


到目前为止,我们(认为我们)知道的是: 首先,让我们检查一下大家都熟悉的行为,在
if()
块中,我们使用
&&
检查这两件事是否正确:

if (true && true) {
   console.log('bar');
} 
现在,您的第一反应可能是:“啊,是的,非常简单,如果
expr1
expr2
都被评估为
true
,代码就会执行语句。”

好的,是和否。你在技术上是正确的,这就是你描述的行为,但这并不完全是代码的评估方式,我们需要深入研究才能完全理解


如何准确解释
&&
|
呢 是时候看看“引擎盖下”了。让我们考虑这个实际例子:

功能消毒(x){
if(isNaN(x)){
返回NaN;
}
返回x;
}
让userinput=0xFF;//例如
const res=sanitise(userinput)&&userinput+5

控制台日志(res)其思想是从左到右读取逻辑表达式,如果左条件的值足以得到总值,则不会处理和计算右条件。一些非常简单的例子:

功能测试(){
const caseNumber=document.querySelector('#sel').value;
constuserchoice=()=>confirm('按OK或Cancel');
如果(案例编号=='1'){
console.log(1==1 | | userChoice());
}else if(案例编号=='2'){
console.log(1==2&&userChoice());
}否则如果(案例编号=='3'){
console.log(1==2 | | userChoice());
}如果为else(案例编号=='4'){
console.log(1==1&&userChoice());
}否则如果(案例编号=='5'){
console.log(userChoice()| | 1==1);
}否则如果(案例编号=='6'){
console.log(userChoice()&&1==2);
}
}
选择测试用例的编号,然后按“RUN!”:

未选择 案例1 案例2 案例3 案例4 案例5 案例6
快跑不客气。我添加了
https://www.google.com/search?q=site:stackoverflow.com+%s
作为一种搜索快捷方式(Chrome/Firefox)来加速搜索。这里还有一个关于我的问题的答案进一步有用的资源:短路是JS的标准吗?谢谢gdoron,请帮助我理解。。。在C#中,我还有类似于&的二元运算符,因此两个操作数都必须为true才能通过,而不是使用&&inC@GibboK. 那么,显然,这个逻辑运算符不可能有短路。你自己试试吧。使用我的演示。@GibboK:看看这个。是的,JS中还有一个二进制And运算符。@GibboK。是的,在标准中!但值得一提的是,正如在javascript实现中使用JIT编译魔法的时代一样,人们确实想知道某些东西是否是“标准”,或者是否可能受制于实现。带二进制逻辑运算符的条件语句的求值方式和(短curcuit)是一种标准行为,我不会1)使用“编译器”这个词。“引擎”更准确。2) 不要谈论
expr1
expr2
condition1
或其他任何东西,这很容易混淆。首先,您还可以引入局部变量,例如
const expr1=true;如果(expr1&&…
@jonaswillms感谢您的输入,请相应地修改答案。这仍然不能直接回答所问的问题。这是我见过的最好的“没有明确回答问题的伟大答案”…这是正确的答案,有着深刻的解释,应该被标记为已接受,并且比当前更高的投票率!
if (true && true) {
   console.log('bar');
}