【问题标题】:Proper use of ||正确使用 ||
【发布时间】:2013-08-03 18:53:59
【问题描述】:

我想的一般问题是:什么时候 ||退回左边的物品,什么时候退回右边的物品?

具体的问题是为什么这不起作用:

var fibonacci = (function () {

    var cache = [0, 1];

    function fibonacci(number) {
        return cache[number] = cache[number] || (fibnonacci(number - 1) + fibonacci(number - 2));
    }

    return fibonacci;
})();

var $div = $('div');

for (var index = 0; index < 10; index++) {
    $('<span />').text(fibonacci(index))
        .appendTo($div);
}

【问题讨论】:

    标签: javascript


    【解决方案1】:

    当且仅当它是真的时,它才返回左边的项目。

    以下内容不真实:

    • 原始布尔值false
    • 原始字符串值""(空字符串)
    • 数字 +0、-0 和 NaN
    • 原始值null
    • 原始值undefined

    其他的都是真实的。

    Here is the list on the language specification.

    在您的情况下,cache[0] 返回 0,我们可以看到它是虚假的,因此它进入递归。这就是我们避免 || 在这些情况下短路的原因。

    您应该考虑直接检查对象是否具有该属性:number in cache 是一种方式,另一种方式是 cache[number] !== undefined

    【讨论】:

    • 不应该缓存[0]返回一个值吗?出于某种原因,它只是给了我一个 StackOverflow (tm)。
    • @sircodesalot 因为cache[0]0,这是假的,所以它进入了无限递归(因为cache[x] 的负数xundefined,即也是假的)。
    • @sircodesalot 不,fibonacci(0) 是假的,这意味着它调用了递归。这正是我们在这些情况下避免||(以及更普遍的“真实性”)的原因。只需使用cache[number]===undefined
    • @BenjaminGruenbaum 正如我所提到的,真正的问题不是cache[0] 是虚假的,而是cache[x] 的否定x 是虚假的,因此是无限递归。
    • @freakish 是的,但我们只检查 cache[x] 是否为负 x 因为 cache[0] 是假的。如果它不是虚假的,我们一开始就不会处于那个位置(就像你在评论中提到的那样):)
    【解决方案2】:

    您的代码不起作用,因为当 0 || func() 要求调用该函数时,您无法使用缓存中的值为 0 的值。

    所以它总是将第二项调用为 0,从而导致堆栈溢出,因为递归没有结束。

    一个解决方案是像这样改变你的内部功能:

    function fibnonacci(number) {
        if (number in cache) return cache[number];
        return cache[number] = fibnonacci(number - 1) + fibonacci(number - 2);
    }
    

    顺便请注意Fibonacci的拼写。

    【讨论】:

    • 啊,废话。所以cache[0] 是假的,所以它调用递归?
    • 是的,这是一个无限递归。
    • 完美,这就像一个魅力。呵呵,没注意到拼写错误,谢谢。
    【解决方案3】:

    它返回左起第一个true。如果没有true,则返回false。如果表达式解析为真,则为布尔值、非零值、非空值或非未定义值。

    编辑:

    是的,值必须是真实的......不仅是真实的。

    【讨论】:

    • 不一定是 true... 只是“真实”。
    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 2014-08-05
    • 2012-11-08
    • 2015-06-09
    • 2021-02-02
    • 2013-07-14
    • 2018-06-30
    • 2017-12-01
    相关资源
    最近更新 更多