【问题标题】:Getting NaN as a result for my JS function. Could anyone explain why?为我的 JS 函数获取 NaN。谁能解释为什么?
【发布时间】:2017-03-19 07:36:39
【问题描述】:

我是 Javascript 新手,所以请多多包涵。我写了一个函数,它返回数组中最高数和最低数之差:

// FUNCTION 1
function range (arr) {
  var max = Math.max.apply(null, arr);
  var min = Math.min.apply(null, arr);
  var max_diff = max - min;
  return max_diff;
}
console.log(range([6,2,3,4,9,6,1,0,5])); // 9

但是,在我想出这个解决方案之前,我尝试了另一种方法:

// FUNCTION 2
function range (arr) {
  var max = function (arr) {
    return Math.max.apply(null, arr);
  }
  var min = function (arr) {
    return Math.min.apply(null, arr);
  }
  var max_diff = max - min;
  return max_diff;
}
console.log(range([6,2,3,4,9,6,1,0,5])); // NaN

此函数返回“NaN”。我阅读了 NaN,但我仍然不清楚为什么我会得到“NaN”。

另一个奇怪的事情是:如果我把 FUNCTION 2 放在 FUNCTION 1 之前,第二个函数实际上返回了正确的结果 (9)。

什么?

【问题讨论】:

  • Ehm,您将两个函数相减。不是函数的结果。 Javascript 中的函数是一个对象,但它不是一个数字。
  • max 和 minimum 是函数,所以你应该使用 max() - min();
  • 在一个简化的示例中,42function() { return 42; } 是两个非常不同的值。您可以在此处阅读有关函数的教程:eloquentjavascript.net/03_functions.html

标签: javascript function closures


【解决方案1】:

您的问题是您从不调用该函数,因此您的 max 和 min 变量是函数而不是数字。

您可以使用 IIFE(声明后调用该函数)

// FUNCTION 2
function range (arr) {
  var max = (function (arr) { return Math.max.apply(null, arr); }(arr));
  var min = (function (arr) { return Math.min.apply(null, arr); }(arr));
  var max_diff = max - min;
  return max_diff;
}
console.log(range([6,2,3,4,9,6,1,0,5])); // NaN

【讨论】:

    【解决方案2】:

    您要减去两个函数,maxmin。所以函数首先被强制转换为原始值,然后被转换为数字,然后被减去。

    当强制转换为原语时,函数返回其代码的依赖于实现的字符串表示。很可能这对数字是不可强制的,所以你得到NaN,即不是数字。减去NaNs 产生NaN

    也许您想改为运行 IIFE(立即调用的函数表达式):

    // FUNCTION 2
    function range (arr) {
      var max = function () {
        return Math.max.apply(null, arr);
      }(); // <-- max is the value returned by calling the function
      var min = function () {
        return Math.min.apply(null, arr);
      }(); // <-- min is the value returned by calling the function
      var max_diff = max - min;
      return max_diff;
    }
    console.log(range([6,2,3,4,9,6,1,0,5])); // 9

    【讨论】:

    • 啊,明白了。我想在我的脑海中我没有使用两个函数,而是两个函数 min 和 max 返回的值。
    【解决方案3】:

    您收到了 NaN,因为您减去了两个方法:

    isNaN(function(){} - function(){}) === true; // true
    

    您需要调用方法并减去它们的结果:

    function range (arr) {
      // method
      var max = function (arr) {
        return Math.max.apply(null, arr);
      }
      
      // method
      var min = function (arr) {
        return Math.min.apply(null, arr);
      }
      
      // invoke the methods
      var max_diff = max(arr) - min(arr);
    
      return max_diff;
    }
    
    document.write(range([1,2,3,4,5,6,7,8,9]));

    顺便说一句,由于您使用的是函数,因此无需在每次调用时传递数组:

    function range (arr) {
      // no need to pass arr
      var max = function () {
        return Math.max.apply(null, arr);
      }
    
      // no need to pass arr
      var min = function () {
        return Math.min.apply(null, arr);
      }
    
      // invoke the methods without passing arr
      var max_diff = max() - min();
    
      return max_diff;
    }
    

    【讨论】:

    • 太棒了。很有帮助。这正是我的问题(认为我正在减去函数结果,但实际上只是试图减去函数)。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2013-10-22
    • 1970-01-01
    • 2013-04-16
    • 2014-01-09
    • 2020-06-17
    • 2023-03-11
    相关资源
    最近更新 更多