我是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 1之前放置FUNCTION 2,第二个函数实际上会返回正确的结果(9)。
Whaaaat?
答案 0 :(得分:2)
您正在减去两个函数max
和min
。因此,首先将函数强制转换为原始值,然后强制转换为数字,然后减去。
当强制转换为基元时,函数返回其代码的依赖于实现的字符串表示形式。很可能这对一个数字来说是不可强制的,所以你得到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
&#13;
答案 1 :(得分: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
&#13;
答案 2 :(得分:0)
你收到了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]));
BTW,因为你正在使用一个函数,所以你不需要在每次调用时都传递一个数组:
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;
}