我目前正在从 http://eloquentjavascript.net/ 学习javascript。 我已经养成了经历给定练习的习惯,然后再进入下一章进行练习。
所以我刚读完第4章,并正在完成本章末尾的练习。 链接: http://eloquentjavascript.net/04_data.html
我刚开始第一个运动问题。
我已成功完成第一个练习题的前两部分:
编写一个带有两个参数的范围函数,start和end,和 返回一个数组,其中包含从开始到(和。)的所有数字 包括)结束。
接下来,编写一个sum函数,它接受一组数字并返回 这些数字的总和。运行上一个程序,看看是否 确实会回归55。
使用以下代码:
// Your code here.
function range(start, end)
{
var rangearray = new Array();
for( var i = start ; (i <= end + 1) ; i++)
rangearray.push(i);
return rangearray;
}
function sum(numarray)
{
var result = 0;
//var numb = 0;
for(numb in numarray)
result += parseInt(numb);
return result;
}
console.log(sum(range(1, 10)));
// → 55 (this is supposed to be the output, and I get this without any problem)
然而,同样的练习还有一个额外的任务,这看起来相当简单,但我却惨遭失败:
作为奖励分配,修改您的范围功能以选择 第三个参数,表示用于构建的“步骤”值 阵列。如果没有给出步骤,则数组元素按增量递增 一,对应旧的行为。函数调用范围(1,10, 2)应该返回[1,3,5,7,9]。确保它也适用 负步长值使范围(5,2,-1)产生[5,4,3,2]。
以下是我正在使用的代码:
// Your code here.
function range(start, end, step)
{
var rangearray = new Array();
end = (end < start) ? end - 1: end + 1;
step = (typeof step === 'undefined') ? 1 : parseInt(step);
var i = 0;
for( i = start ; ((step < 0) ? (i >= end) : (i <= end)) ; (i + step) )
{rangearray.push(i);}
return rangearray;
}
function sum(numarray)
{
var result = 0;
//var numb = 0;
for(numb in numarray)
result += parseInt(numb);
return result;
}
console.log(range(5, 2, -1));
// → [5, 4, 3, 2] (this is supposed to be the output)
当代码运行时,我收到一条警告消息,说明代码已运行超过2秒,并询问是否应该中止代码。 10秒后发生同样的事情。在中止时,收到以下错误:
错误:已中止(功能勾选中的第204行)
从功能范围的第9行调用
从第25行调用
非常感谢任何指导。 :)
答案 0 :(得分:0)
您收到此消息的原因是您已成功创建了第一个无限循环!但是不要心疼,这是一个非常普遍的问题。你创建的for循环实际上永远不会结束。这是因为你没有递增“i”所以它永远不会变得大于或等于结束。相反,你只是在做一些计算机非常乐意做的数学计算。而不是“+”,你需要“+ =”来实际分配“i”本身加上“步骤”。另外,我拿出你的三元运算符“结束”,因为我根本没有看到它的原因。你之前的代码很好。我希望你喜欢JavaScript!
最后一个建议是永远不要将三元运算符置于for循环中。
// Your code here.
function range(start, end, step)
{
var rangearray = new Array();
step = (typeof step === 'undefined') ?
1 : parseInt(step);
var i = 0;
for( i = start; i <= end ; (i += step) )
{rangearray.push(i);}
return rangearray;
}