添加数字并接收 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")