【问题标题】:The program isn't running as expected程序未按预期运行
【发布时间】:2022-12-10 12:57:12
【问题描述】:

代码的思路很简单:检查参数类型,如果是数字,则将所有数字相加。如果类型是包含数字的字符串,则从字符串中提取数字并将其添加到提取的其他数字中。如果根本没有数字,只有字符串,则在控制台返回消息:"All are strings"

let result = 0;
function specialMix(...data) {
    for (let i = 0; i < data.length; i++) {
        if (typeof data[i] === "number") {
            result += data[i];
        } else if (typeof data[i] === "string") {
            if (typeof parseInt(data[i]) === "number") {
                result += parseInt(data[i]);
            }  else if (typeof parseInt(data[i]) === "NaN") {
                continue;
            } else if (result === 0) {
                console.log("All are strings");
            }
        }
    }
    return result;
}

console.log(specialMix(10, 20, 30)); // 60
console.log(specialMix("10Test", "Testing", "20Cool")); // 30
console.log(specialMix("Testing", "10Testing", "40Cool")); // 50
console.log(specialMix("Test", "Cool", "Test")); // All are Strings

代码的第一个测试(console.log)有效并给出了所需的结果,但其余测试给出了NaN,我不明白为什么会这样。我不明白代码的逻辑有什么问题。

【问题讨论】:

  • 您在函数外定义了let result。因此它将在通话之间共享,一旦它是NaN,它就永远不会重置。
  • 另外,typeof(NaN) === 'number'。你想要 Number.isNaN(x) 代替。
  • 实际上,变量是在函数外声明的。
  • 打字错误,它定义在外面,但需要在里面
  • 我试图在函数内部声明变量,但我得到了相同的结果。

标签: javascript function loops


【解决方案1】:

首先,您应该将 let result = 0 放入您的函数中,以便在您再次调用该函数时重置它的值。 然后,如果 data[i] 的类型不是数字,在您的 else if 中,您可以更改条件以检查该值的 parseInt() 是否为真(如果不是,则表示在 NAN 中),因此您不需要另一个检查是否为 NAN 的条件。

function specialMix(...data) {
    let result = 0;
    for (let i = 0; i < data.length; i++) {
        if (typeof data[i] === "number") {
            result += data[i];
        } else if (typeof data[i] === "string") {
            if (parseInt(data[i])) {
                result += parseInt(data[i]);
            }
        }
    }
    if (result == 0) return 'All are strings'
    return result;
}

console.log(specialMix(10, 20, 30)); // 60
console.log(specialMix("10Test", "Testing", "20Cool")); // 30
console.log(specialMix("Testing", "10Testing", "40Cool")); // 50
console.log(specialMix("Test", "Cool", "Test")); // All are Strings

在 处,您可以检查 result 是否仍然为 0,如果是,它将返回消息,否则它将返回值,如果 result 变量。

【讨论】:

  • 感谢您的解释 。我还有一个关于上面代码的问题。当括号中的值计算为数字时,( if (parseInt(data[i])) ) 如何计算为真?
  • @Mohammed - 这是标准的 C 风格布尔值评估 - 如果数字不为 0,则为真。如果你想更具体一点,很多 JavaScript 程序员在值前使用 !! 来“检查其真实性”,所以 - !!parseInt(data)
  • @Mohammed,实际上数字也是真的(除了 0 不影响结果)所以如果结果是任何数字,条件是真的,但是因为 NAN 代表 Not A Number 并且总是假的,所以条件将是错误的。
猜你喜欢
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
相关资源
最近更新 更多