【问题标题】:console.log(-1) still returns NaNconsole.log(-1) 仍然返回 NaN
【发布时间】:2020-07-06 21:13:50
【问题描述】:

我在这里有我的作业用 js 代码。我有一个if 语句,当输入不是数字时应该在控制台中返回-1,而不是返回-1,而是返回NaN。有人可以帮我解决这个问题吗?

function calculateFoodOrder(numAnimals, avgFood) {
    // IMPLEMENT THIS FUNCTION!

    var total = avgFood*numAnimals;
    
        if ((Number(numAnimals || avgFood) < 0) && (isNaN(numAnimals || avgFood))) {
                console.log(-1);
            } else {
                return total
            }
                
    }
    calculateFoodOrder() 

【问题讨论】:

  • 因为NaN不小于0
  • 我怀疑您的 if 条件是否符合您的预期。
  • @Andreas 我不明白你的意思
  • not a number 是如何定义的?在您的示例中,您过滤小于零的数字,根据定义,这些数字是数字。

标签: javascript


【解决方案1】:

函数中的默认值是“未定义”。这就是javascript显示NaN的原因。定义默认值以避免这种情况。例如:

function calculateFoodOrder(numAnimals = 0, avgFood = 0) {

    var total = avgFood*numAnimals;

    if ((Number(numAnimals || avgFood) < 0) && (isNaN(numAnimals || avgFood))) {
        console.log(-1);
    } else {
        return total;
    }
}

【讨论】:

  • 我完全意识到这一点,但是问题告诉我我无法更改功能部分。当我尝试您的示例时,自动评分器将 ` = 0 ` 视为语法错误
  • 你能在你的函数中检查'undefined'吗?如果您的变量之一未定义,则:console.log(-1)
  • 自动评分器会自动定义一个值,这就是您的代码出现语法错误的原因。它试图做calculateFoodOrder(numAnimals = 0 = 5, avgFood = 0 = 6)
  • NaN 不小于 0,如果你给两个字符串作为参数,它仍然会得到 NaN。
  • 那么自动评分器已经过时了,因为 = 0 将是有效的 ES6 代码。 (虽然不是 ES5。)
【解决方案2】:

如果我正确理解您的任务,您只需使用isNaN 检查两个参数是否不是NaN

您的示例代码不起作用,因为与NaN 的任何比较都会返回false,因此Number(numAnimals || avgFood) &lt; 0 永远不会是trueCheck here for details on NaN.

function calculateFoodOrder(numAnimals, avgFood){
  //REM: Default result
  let tResult = -1;

  //REM: Check if both paramters are not NaN
  //REM: Be aware that whitespaces and empty strings validate to zero
  if(
    !isNaN(numAnimals) &&
    !isNaN(avgFood)
  ){
    tResult = Number(avgFood) * Number(numAnimals)
  };
  
  return tResult
};

//REM: Default test case
console.log(calculateFoodOrder());

;document.querySelector('button').onclick = function(){
  console.log(
    calculateFoodOrder(
      document.getElementById('innumAnimals').value,
      document.getElementById('inavgFood').value
    )
  )
};
<input type = 'text' value = '' id = 'innumAnimals' placeholder = 'numAnimals' />
<input type = 'text' value = '' id = 'inavgFood' placeholder = 'avgFood' />
<button>do</button>

【讨论】:

    【解决方案3】:

    如果您是初学者,请不要将自己与警告混淆。转换成数字后应该赋值给自己,然后像这样判断是NaN值还是小于零,

    function calculateFoodOrder(numAnimals, avgFood) {
        // IMPLEMENT THIS FUNCTION!
        numAnimals = Number(numAnimals);
        avgFood = Number(avgFood);
    
        var total = avgFood * numAnimals;
    
        if (isNaN(numAnimals) || isNaN(avgFood) || numAnimals < 0 || avgFood < 0 ) {
            console.log(-1);
        } else {
            return total
        }
    
    }
    calculateFoodOrder()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多