正确使用||

时间:2013-08-03 18:54:00

标签: javascript

我想的一般问题是:什么时候做?|返回左侧的项目,何时返回右侧的项目?

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

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

3 个答案:

答案 0 :(得分:11)

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

以下不是真理:

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

其他一切都是真的。

Here is the list on the language specification

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

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

答案 1 :(得分: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的拼写。

答案 2 :(得分:0)

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

编辑:

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