[英]How does the OR operator work in this javascript?
给定一个数字,程序应仅使用* 3或+5返回一个操作序列以获取数字,因此有两条路径可供选择。 该程序在调用自身时如何知道要进行哪个函数调用? 以及它如何知道调用每个路径多少次。 换句话说,我不理解如何使用OR
运算符来确定要使用find()
调用以及每个调用find()
多少个。
function findSequence(goal) {
// we start at 1, and history is a string that will keep track of the operations
function find(start, history) {
// case when start and goal is 1.
if (start == goal)
return history; // return string containg 1
// case when we build start past what we needed
else if (start > goal)
return null;
else
// Dont understand this part!
return find(start + 5, "(" + history + " + 5)") ||
find(start * 3, "(" + history + " * 3)");
}
return find(1, "1");
}
document.write(findSequence(13));
||
运算符检查左操作数的真值。 有趣的是||
表达式的计算结果为true
或false
。 如果真值是true,则表达式的计算结果为该左操作数。 如果不是,则计算为正确的操作数。 例:
> 5 || 10
5
> 5 || 0
5
> 0 || 10
10
> 0 || undefined
undefined
因此a || b
a || b
实际上等于a ? a : b
a ? a : b
。 类似地, a && b
实际上等于a ? b : a
a ? b : a
:
> 0 && 10
0
> 0 && undefined
0
> 5 && 10
10
> 5 && undefined
undefined
非布尔值的真值在JavaScript规范中确定:
编辑:呵呵,正如mattedgod指出的那样,一旦表达式求出结果,该表达式的其余部分根本就不会得到求值。 例如:
> function fail() { throw "I failed!"; }
> fail()
XXX "I failed!"
> 5 || fail()
5
> 0 && fail()
0
在上述情况下不会发生故障,但在以下情况下会发生故障:
> 0 || fail()
XXX "I failed!"
> 5 && fail()
XXX "I failed!"
因此,如果您有两次调用find()
类的find(...) || find(...)
find(...) || find(...)
,如果第一个调用的结果具有真实值,则将返回其结果,而第二个调用将根本不执行。 如果第一个调用的结果具有错误的真值,则将执行第二个调用,并且表达式的计算结果为结果。
这依赖于JavaScript(以及许多其他语言)的一种称为“短路”的属性。
如果您考虑一下,如果您正在评估某项事情为真,那就是A || B
A || B
,如果A为true,则整个表达式为true,没有意义检查B。 &&
则为true,如果A为false且您正在评估A && B
,则整个表达式为false,因此无需理会与B。
在您的示例中,如果第一次调用find
成功,它将不会执行第二次调用。 但是,如果第一次调用未成功(我猜它返回false或null或结果为JS false),则将执行第二次调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.