5

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

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

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);
}
4

3 回答 3

12

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

以下不属实:

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

其他一切都是真实的。

这是语言规范的列表

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

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

于 2013-08-03T18:55:30.390 回答
1

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

所以它总是将第二项称为 0 并因此导致堆栈溢出,因为递归没有结束。

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

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

顺便说一句,请注意Fibonacci的拼写。

于 2013-08-03T18:58:02.320 回答
0

true它从左边返回第一个。如果没有true,则返回false。如果表达式解析为真,则在布尔值或非零或非空或非未定义值的情况下。

编辑:

是的,价值必须是真实的……不仅是真实的。

于 2013-08-03T18:56:37.167 回答