添加数字并接收 NaN
Adding numbers and receiving a NaN
我有这个代码,它 javascript 并且正在使用 cs.js(Minecraft 1.8 的聊天触发器)
register('command', function(...arguments) {
ChatLib.chat(arguments.length);
if (arguments.length % 2 != 0) {
for (argument in arguments) {
arg = arguments[argument];
if (isNaN(parseInt(arg))) {
let num1 = parseFloat(arguments[argument - 1]);
let num2 = parseFloat(arguments[argument + 1]);
let equals = 0;
switch (arg) {
case "+":
equals = num1 + num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
case "-":
equals = num1 - num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
case "*":
equals = num1 * num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
case "/":
equals = num1 / num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
case "%":
equals = num1 % num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
default:
ChatLib.chat(`${color.RED}${color.UNDERLINE}WOAH THERE BUCKO! ${color.RESET}${color.GOLD}You're only allowed to do single operations, do /calc help if you need help with the syntax.`);
break;
}
}
}
}
}).setName("calc");
每当我 运行 这个,7 + 3 返回 NaN 给我时,我注意到它在等号区域附近的某个地方,因为当我进行调试时,它似乎出错了.我尝试尽可能多地进行研究,但我找不到任何有类似问题的人,运行 通过代码我没有看到任何问题,除了那里可能有些低效。似乎出错的部分是:
equals = num1 + num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
非常感谢任何帮助,这变得非常令人沮丧。
这是问题的根源:
for (argument in arguments) {
虽然 arguments
是一个数组,这导致 argument
成为每个元素的文本 属性,因此您最终迭代了 "0"
、"1"
和 "2"
.
它被自己使用的地方,例如这里:
arg = arguments[argument];
正在寻找正确的元素。当它深入到它试图获取上一个和下一个元素的部分时,它部分起作用了。这行没问题:
let num1 = parseFloat(arguments[argument - 1]);
这行不是:
let num2 = parseFloat(arguments[argument + 1]);
那是因为 -
在减去 1 之前将 argument
转换为数字,而 +
运算符正在进行字符串连接,因此您最终会寻找:
let num2 = parseFloat(arguments["11"]);
由于参数中没有 属性 11,因此 num2
最终成为 NaN
。
一个简单的修复方法是更新您的 for 循环以显式循环数字索引,而不是遍历命名属性(在数组中恰好是数字索引的字符串表示):
for (let argument = 0; argument < arguments.length; argument++) {
function f(...arguments) {
console.log(arguments.length);
if (arguments.length % 2 != 0) {
for (let argument = 0; argument < arguments.length; argument++) {
arg = arguments[argument];
if (isNaN(parseInt(arg))) {
let num1 = parseFloat(arguments[argument - 1]);
let num2 = parseFloat(arguments[argument + 1]);
let equals = 0;
switch (arg) {
case "+":
equals = num1 + num2;
console.log(`Success!`);
console.log(equals.toString());
break;
case "-":
equals = num1 - num2;
console.log(`Success!`);
console.log(equals.toString());
break;
case "*":
equals = num1 * num2;
console.log(`Success!`);
console.log(equals.toString());
break;
case "/":
equals = num1 / num2;
console.log(`Success!`);
console.log(equals.toString());
break;
case "%":
equals = num1 % num2;
console.log(`Success!`);
console.log(equals.toString());
break;
default:
console.log(`WOAH THERE BUCKO! You're only allowed to do single operations, do /calc help if you need help with the syntax.`);
break;
}
}
}
}
}
f("3", "+", "7")
我有这个代码,它 javascript 并且正在使用 cs.js(Minecraft 1.8 的聊天触发器)
register('command', function(...arguments) {
ChatLib.chat(arguments.length);
if (arguments.length % 2 != 0) {
for (argument in arguments) {
arg = arguments[argument];
if (isNaN(parseInt(arg))) {
let num1 = parseFloat(arguments[argument - 1]);
let num2 = parseFloat(arguments[argument + 1]);
let equals = 0;
switch (arg) {
case "+":
equals = num1 + num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
case "-":
equals = num1 - num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
case "*":
equals = num1 * num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
case "/":
equals = num1 / num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
case "%":
equals = num1 % num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
default:
ChatLib.chat(`${color.RED}${color.UNDERLINE}WOAH THERE BUCKO! ${color.RESET}${color.GOLD}You're only allowed to do single operations, do /calc help if you need help with the syntax.`);
break;
}
}
}
}
}).setName("calc");
每当我 运行 这个,7 + 3 返回 NaN 给我时,我注意到它在等号区域附近的某个地方,因为当我进行调试时,它似乎出错了.我尝试尽可能多地进行研究,但我找不到任何有类似问题的人,运行 通过代码我没有看到任何问题,除了那里可能有些低效。似乎出错的部分是:
equals = num1 + num2;
ChatLib.chat(`${color.GREEN}Success!`);
ChatLib.chat(`${color.GREEN}` + equals.toString());
break;
非常感谢任何帮助,这变得非常令人沮丧。
这是问题的根源:
for (argument in arguments) {
虽然 arguments
是一个数组,这导致 argument
成为每个元素的文本 属性,因此您最终迭代了 "0"
、"1"
和 "2"
.
它被自己使用的地方,例如这里:
arg = arguments[argument];
正在寻找正确的元素。当它深入到它试图获取上一个和下一个元素的部分时,它部分起作用了。这行没问题:
let num1 = parseFloat(arguments[argument - 1]);
这行不是:
let num2 = parseFloat(arguments[argument + 1]);
那是因为 -
在减去 1 之前将 argument
转换为数字,而 +
运算符正在进行字符串连接,因此您最终会寻找:
let num2 = parseFloat(arguments["11"]);
由于参数中没有 属性 11,因此 num2
最终成为 NaN
。
一个简单的修复方法是更新您的 for 循环以显式循环数字索引,而不是遍历命名属性(在数组中恰好是数字索引的字符串表示):
for (let argument = 0; argument < arguments.length; argument++) {
function f(...arguments) {
console.log(arguments.length);
if (arguments.length % 2 != 0) {
for (let argument = 0; argument < arguments.length; argument++) {
arg = arguments[argument];
if (isNaN(parseInt(arg))) {
let num1 = parseFloat(arguments[argument - 1]);
let num2 = parseFloat(arguments[argument + 1]);
let equals = 0;
switch (arg) {
case "+":
equals = num1 + num2;
console.log(`Success!`);
console.log(equals.toString());
break;
case "-":
equals = num1 - num2;
console.log(`Success!`);
console.log(equals.toString());
break;
case "*":
equals = num1 * num2;
console.log(`Success!`);
console.log(equals.toString());
break;
case "/":
equals = num1 / num2;
console.log(`Success!`);
console.log(equals.toString());
break;
case "%":
equals = num1 % num2;
console.log(`Success!`);
console.log(equals.toString());
break;
default:
console.log(`WOAH THERE BUCKO! You're only allowed to do single operations, do /calc help if you need help with the syntax.`);
break;
}
}
}
}
}
f("3", "+", "7")