获得NaN作为我的JS函数的结果.有人能解释一下原因吗?

Getting NaN as a result for my JS function. Could anyone explain why?

本文关键字:一下 能解释 我的 NaN JS 函数 结果 获得      更新时间:2023-09-26

我是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)。

Whaaaat吗?

您正在减去两个函数,maxmin。因此,首先将函数强制转换为基本值,然后强制转换为数字,然后再进行减法。

当强制转换为原语时,函数返回与实现相关的代码字符串表示形式。最可能的是它不能被一个数强制,所以你得到NaN,也就是非一个数。减NaN s得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

你的问题是你从来没有调用过函数,因为你的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

您收到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;
}