OR操作符如何在此javascript中工作

How does the OR operator work in this javascript?

本文关键字:javascript 工作 操作符 OR      更新时间:2023-09-26

给定一个数字,程序应该返回一个仅使用*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));

||运算符检查左操作数的真值。有趣的是,||的表达式不能求出truefalse。如果真值为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的东西),则第二次调用将被执行。