【问题标题】:Javascript Switch case keeps returning NaN value [closed]Javascript Switch案例不断返回NaN值[关闭]
【发布时间】:2020-04-19 22:13:26
【问题描述】:

我还是 Javascript、switch 语句和其他编程概念的新手。我的问题是每当我尝试访问案例 2 时,它都会返回 NaN 而不是整数值或数字。我的论点在 console.log() 中是否无效?还是我错误地使用了我的 switch 语句?

const constantVol = (num, T1, T2, P1, P2) => {
  let choice = num;
  switch(choice){
    case 1:
        choice = (T2 / T1) * P1;
        break;
    case 2:
        choice = (P2 * T1) / P1;
        break;
    default:
        choice = "Not valid"
        break;
  }
  return choice;
}

console.log(constantVol(num=2, P2=16.33, P1=3.4, T1=296.5));

【问题讨论】:

  • P2 未定义。数学运算中的未定义返回 NaN
  • 另外你不能在Javascript中使用命名参数
  • 你传递了 4 个参数,所以第 5 个参数是未定义的
  • 我只想指出,这个问题实际上可以帮助很多新手。尽管如果它的措辞更好。我敢肯定,有很多使用命名参数的语言的程序员会感到困惑,因为 Javascript 在其语法中提供了足够的灵活性,代码仍然可以运行,但没有保持其意图,因为(在这种情况下)命名参数不是Javascript 支持。
  • 对于来自 Python 或任何具有命名参数的语言的人来说,这里发生的是 (num=2)===2 (T1=296.5)===296.5,所以 constantVolP1===296.5P2===undefined 结尾(不是传递了一个值)。截至今天的 Javascript 没有命名参数。最接近命名参数语法的是对象解构。

标签: javascript switch-statement arguments parameter-passing


【解决方案1】:

所以我们在 Javascript 中没有命名参数,但我们可以使用对象解构来模拟类似的语法。
我将名称作为一个参数的对象映射传递给函数 {key: value},然后使用解构从属性中获取命名变量 var [key]=value。

const constantVol = ({num, T1, T2, P1, P2}) => {
  let choice = num;
  switch(choice){
    case 1:
        choice = (T2 / T1) * P1;
        break;
    case 2:
        choice = (P2 * T1) / P1;
        break;
    default:
        choice = "Not valid"
        break;
  }
  return choice;
}

console.log(constantVol({num: 2, P2: 16.33, P1: 3.4, T1: 296.5}));

【讨论】:

  • 他正在尝试使用命名参数。可能来自Python或其他东西。 =或者按顺序传参数不符合他的意图
  • =符号无关。 Javascript恰好允许变量赋值返回以其语法分配的值,因此参数作为每个位置的参数被发送。他只需要知道我们在 Javascript 中没有命名参数。
  • 不,您稍后对其进行了编辑,并且即使在您的答案中也保留了语法,即使进行了编辑,仍然无法正确解释他对什么感到困惑。然后在这里评论说该函数仍然可以与= 一起使用,但显然它不会,因为他在尝试使用命名参数语法时将它们乱序传递。
  • 是的,但它仍然是错误的并且还具有误导性。如果您真正了解发生了什么,您将使用相同的语法,但不使用= 符号来突出问题,而是声称“如果您使用=,则参数必须按顺序排列”。这显然与他是否使用=无关。
  • 是的,好的。您去编辑您的评论以添加“以正确的顺序传递它们”,然后声称这“正是您所说的”,我可能会屈尊补充。然后更糟糕的是,将其编辑到您的答案中,但仍然在您的答案中声称“如果您使用=,则参数必须按顺序排列”。这与他是否使用= 无关,并且完全具有误导性。
【解决方案2】:

调用函数时,您需要以正确的顺序向所有参数发送值。在这里,函数 constantVol 需要 5 个值,而您只发送 4 个。此外,它们将按照传递的顺序被读取,无论您在调用它时是否添加变量都没有关系。 所以当你打电话时

    constantVol = (num, T1, T2, P1, P2)

    console.log(constantVol(num=2, P2=16.33, P1=3.4, T1=296.5));

你得到:

    num = 2 
    T1 = 16.33
    T2 = 3.4
    P1 = 296.5
    P2 = undefined

【讨论】:

    【解决方案3】:

    我对 JacaScript 也没有那么丰富,但是 你的代码看起来你没有给它 P2 的值?

    但我刚刚看到你想选择案例 2.. 但如果你做数学,你会去默认情况,因为结果不是 2

    【讨论】:

      猜你喜欢
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2017-10-25
      • 2019-02-22
      • 1970-01-01
      相关资源
      最近更新 更多