我想的一般问题是:什么时候做?|返回左侧的项目,何时返回右侧的项目?
具体问题,这就是为什么不起作用:
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);
}
答案 0 :(得分:11)
当且仅当它是真的时,它才会返回左侧的项目。
以下不是真理:
false
""
(空字符串)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或非未定义值的情况下。
是的,价值必须是真实的......不仅如此。