[英]Function to create new array producing undefined
我正在尝试编写一个创建数组的程序,并用一系列数字填充它。 函数范围的x,y,z变量与每个步骤的起始编号,结束编号和编号值相关。 我的目标是生成一个数组,其中包含每个步骤创建的x和y之间的所有数字(包括)。 这是代码:
let newarray = [] function range (x, y, z){ if (x === undefined || y === undefined || z === undefined || (x > y) || (z < 0)) { return newarray; // returns empty array if x, y, or z is undefined, x is greater than y or z is a negative integer } else if (y > x) { for (x; x < y; x = x += z) { newarray.push(x); //pushes x into an array then adds z into x and loops until x exceeds y } } else { return newarray; //prints out new array } } console.log(range(0, 10, 2)); console.log(range(10, 30, 5)); console.log(range(-5, 2, 3));
现在它正在为所有三个数字生成未定义。 我的研究提出了一些关于异步性的东西? 我不确定这意味着什么。
这里有一些事情在起作用:
newArray
应该在函数作用域内定义,而不是作为全局变量定义。 否则,对函数的后续调用将继续追加到同一个数组上,这可能不是你的意图(如果是的话,那就是array.concat()
)。
你最后else
不可达,因此函数或者返回一个空数组输入失败的验证或返回undefined
填充数组中的后,当控制到达函数结束else if
块。
x = x += z
可能意图为x += z
。
你应该禁止z === 0
否则你将无限循环。
正常的JS风格是camelCase
变量名。
另外,我发现写正条件比负条件更容易。 在这种情况下,枚举允许的参数似乎最干净。 此方法使您只能使用一个return
语句和更少的条件分支,从而减少可能的混淆。
这是一个解决这些问题的版本:
function range(x, y, z) { const newArray = []; if ([x, y, z].indexOf(undefined) < 0 && x < y && z > 0) { for (; x < y; x += z) { newArray.push(x); } } return newArray; } console.log(range(0, 10, 2)); console.log(range(10, 30, 5)); console.log(range(-5, 2, 3));
请注意,您检查的部分else if (y > x)
没有返回。 当此条件为真时,您的函数返回undefined
。 要解决这个问题,只需添加return newarray;
作为函数的最后一行。 然后使用return new array;
删除所有其他行return new array;
。
else
块不是必需的,因为它将无法访问并将返回undefined
。
从x = x += z
校正x = x + z
x = x += z
。
数组声明在外面,所以每次旧数据都会附加来自for循环的更新数据。
function range (x, y, z){ let newarray = []; if (x === undefined || y === undefined || z === undefined || (x > y) || (z < 0)){ return newarray; } else if (y > x) { for (x; x < y; x = x + z){ newarray.push(x); } } return newarray; } console.log(range(0, 10, 2)); console.log(range(10, 30, 5)); console.log(range(-5, 2, 3));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.