繁体   English   中英

OR运算符如何在此javascript中工作?

[英]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));

|| 运算符检查左操作数的真值。 有趣的是|| 表达式的计算结果为truefalse 如果真值是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规范中确定:

  • 未定义->错误
  • 空->错误
  • 字符串->如果为空字符串则为False,否则为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(...) 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM