OR操作符如何在此javascript中工作
How does the OR operator work in this javascript?
给定一个数字,程序应该返回一个仅使用*3或+5来获得该数字的操作序列,因此有两条路径可选。这个程序在调用自己时如何知道调用哪个函数?它怎么知道调用每条路径的次数。换句话说,我不明白OR
运算符是如何被用来确定对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 ? a : b
。类似地,a && b
实际上相当于a ? b : a
:
> 0 && 10
0
> 0 && undefined
0
> 5 && 10
10
> 5 && undefined
undefined
非布尔值的真值在JavaScript规范中确定:
- 未定义-> False
- Null -> False
- String ->如果为空则为False,否则为True
- Object> True
编辑:哦,正如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()
,如果第一次调用的结果是一个真值,那么它的结果将被返回,而第二次调用根本不会执行。如果第一次调用的结果为假真值,则执行第二次调用,表达式的求值为该结果。
这依赖于JavaScript(和许多其他语言)称为"短路"的属性。"
如果你想一下,如果你计算的结果为真,而它是A || B
,如果A为真,那么整个表达式也为真,检查b就没有意义了。相反,对于&&
,如果A为假,你计算的是A && B
,那么整个表达式都为假,所以检查b就没有意义了。
在您的示例中,如果对find
的第一次调用成功,它将不会执行第二个。但是,如果第一次调用不成功(我猜它返回false或null或评估为JS false的东西),则第二次调用将被执行。
- 在表单提交将DOM的一部分替换为分部之后,我应该将ajax成功绑定到什么来使我的javascript工作
- 我可以'不要让Javascript工作不正常
- 如何让我的html5功能不兼容警告使用javascript工作
- Excel Web Services 电子邮件 JavaScript 工作表
- 用于Google Fusion Table层的Javascript工作,但试图整理代码
- Bootstrap:如何附加一个类,并且仍然有BS Javascript工作
- JavaScript 工作队列
- JavaScript工作,直到我添加这个&&陈述
- 为什么不'在CasperJS中没有简单的JavaScript工作
- 如何"递归AJAX回调”;在JavaScript工作中
- 基本验证javascript工作不正常
- 需要帮助让这个字符串的Javascript工作
- HTML和JavaScript工作不正常
- 下拉菜单无法从CSS或Javascript工作
- 需要从erb生成一个非常特定的html来让javascript工作
- 如果javascript代码段未使用,它将阻止其他javascript工作
- 将内联事件处理程序移动到chrome扩展的javascript工作表
- 阻止其他Javascript工作的Javascript
- iframe阻止javascript工作
- 无法获取切换函数(JavaScript工作)