问题标签 [short-circuit-evaluation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
1338 浏览

php - 在 PHP 中打破多个函数(短路)

我想在 PHP 中返回多个嵌套函数。可以通过在“break”之后添加一个数字来打破多个循环。例如。

我可以在调用一系列函数时进行断路吗?

0 投票
3 回答
6924 浏览

python - 如何防止短路评估?

这是我在处理 Django 项目时遇到的一个问题。这是关于表单验证的。

在 Django 中,当您有一个提交的表单时,您可以调用is_valid()相应的表单对象来触发验证并返回一个布尔值。所以,通常你的视图函数中有这样的代码:

is_valid()不仅验证表单数据,还向表单对象添加错误消息,之后可以显示给用户。

在一个页面上,我同时使用了两个表单,并且还希望仅当两个表单都包含有效数据时才保存数据。这意味着我必须is_valid()在执行代码之前调用这两个表单来保存数据。最明显的方式:

由于逻辑运算符的短路评估而无法工作。如果form1无效,form2则不会进行评估,并且会丢失其错误消息。

这只是一个例子。据我所知,在其他语言(即 Smalltalk)中没有and/的贪婪替代品。or我可以想象在不同的​​情况下会出现这个问题(不仅在 Python 中)。我能想到的解决方案都是笨拙的(嵌套ifs,将返回值分配给局部变量并在if语句中使用它们)。我想知道解决此类问题的pythonic方法。

0 投票
1 回答
228 浏览

javascript - JS 短期评估是否适用于 async/await?

众所周知,在此代码段中,如果getFirst()返回真值,getSecond()则不进行评估:

但是,我很好奇异步函数是否同样适用:

它是启动第二个承诺,还是等待第一个得到解决?

0 投票
0 回答
35 浏览

python - 是否有与 Ada “然后”和“或其他”等价的 Python?(懒惰的评价)

使用 Ada,您可以使用and then代替andor else代替or.

在 Ada 中,通过以下示例,当您使用惰性求值运算符时,仅在必要时(即 if ais )对 b 进行求值。true

是否有与此等效的 Python?

0 投票
2 回答
240 浏览

javascript - 具有短路评估的对象解构

是否有可能实现这样的目标?

结果得到-> name = 'tom' and age=20

上面的代码不起作用,因为它只评估一次条件,而不是对每个变量赋值,这当然是有道理的。它评估为 name='tom', age=undefined

有什么办法可以使这个逻辑起作用吗?

谢谢!

0 投票
1 回答
190 浏览

javascript - 有人可以解释一下为什么“运算符优先级”适用于 javaScript 中的“||”、“&&”等逻辑运算符

有人能解释一下为什么运算符优先级适用于 JavaScript 中的||和等逻辑运算符吗?&&这在以下操作中意味着什么:

真 || 假 && 假

false && false因为&&运算符的优先级高于||JavaScript 中的运算符,所以首先计算 the。根据我所知道的false && false,JavaScript 引擎不会评估它,因为在 || 之前 运算符有一个true文字,当某些东西在运算符true之前时,将不会评估运算||符之后的东西,||这在 JavaScript 中称为“逻辑运算符的短路”,另一个示例将是:

真 || 警报()

即使函数调用的优先级高于||运算符,函数调用也不会发生,另一个例子是

真 || x = 7

如果在 JavaScript 中逻辑运算符的短路是真的,那么上面的代码一定不能给出错误,因为x = 7没有被计算,因为在||运算符之前有一个true文字。

0 投票
1 回答
62 浏览

sql - 如果不需要,SQL Server 是否足够聪明,不会执行昂贵的查询?(短路)

因此,SQL Server 不会像通用编程语言中的 if 语句那样以显式方式进行短路。

因此,请考虑以下模拟查询:

假设表中只有 3 行并且它们都匹配 name = 'someValue'。昂贵的子查询会运行吗?假设有 300 万行,除了 1 之外的所有行都可以使用 name = 'someValue' 获取,但需要使用子查询获取的 1 行除外。不需要时是否会评估子查询?

如果有人有类似的真实案例,那么只要在没有 99.99% 案例的子查询的情况下快速获取结果,就可以让 0.01% 的人在获得结果之前等待昂贵的子查询运行。(我知道我上面的具体示例可以使用 SP 中的 IF 语句显式处理,正如此相关线程中所建议的: Sql short circuit OR or conditional exists in where 子句 ,但我们假设这不是一个选项。)

0 投票
1 回答
115 浏览

javascript - JavaScript 短路仍然引发未定义的错误

我正在使用 AngularJs 中的一些旧代码。someVar1JS ether 中可能存在一个变量,如果存在,我想将它附加到我的范围,如下所示:

但偶尔,当someVar1以太中不存在时,我会收到此错误:

错误:未定义 someVar1

它直接指向someVar1JS 文件中的行和列。

为什么会这样?我的印象是someVar1 || 0会检查是否someVar1未定义,这是错误的,并将其设置$scope.someVar2为 0。

0 投票
0 回答
229 浏览

llvm - How does llvm ir handle different kind of short circuits?

For the following code in C:

The CFG is as following:

enter image description here

But when I change the if on line 2 to while:

Then the CFG is changed to:

enter image description here

So the basic block lor.end and land.end are generated, but they are not corresponding to any statement in the program. Why does while.cond not connects to while.end directly just like entry -> if.else in the first CFG? In other words, why are lor.end and land.end generated? It seems that the way of handling short circuits in if statements are different from that in loop statements. What causes this difference?

compiling script(calng/llvm 7.0.1): clang -emit-llvm -c -g -fno-discard-value-names file_name.c

0 投票
1 回答
65 浏览

typescript - Typescript 赋值中的操作顺序使用 || 和数组 .find

我想确保我的作业中的操作按特定顺序发生。我假设它按照我在下面列出的顺序,但我无法在打字稿上找到确认/否认这一点的文档。

假设上述使用短路逻辑按顺序执行,我是否正确?我在https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#optional-chaining找到的文档在我阅读它时在这个特定主题上看起来模棱两可。