2016-11-05 68 views
1

我是Javascript新手,很抱歉,我写了返回数组的最高和最低数之间的差的函数:为我的JS函数获取NaN。谁能解释为什么?

// 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”。另一个奇怪的是:如果我把FUNCTION 2放在FUNCTION 1之前,第二个函数实际上返回正确的结果(9)。

Whaaaat?

+2

埃姆,你从彼此减去两个功能。不是功能的结果。 Javascript中的函数是一个对象,但它不是一个数字。 –

+0

max和minimum是函数,所以你应该使用max() - min(); – Mahi

+0

在一个简单的例子中,'42'和'function(){return 42; }是两个非常不同的值。你可以在这里阅读关于函数的教程:http://eloquentjavascript.net/03_functions.html。 –

回答

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]));

顺便说一句,因为你正在使用一个函数,你不需要在每次调用时传递一个数组:

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; 
} 
+0

太棒了。非常有帮助。这正是我的问题(认为我正在减去函数结果,但实际上只是试图减去函数)。谢谢。 – DeeK

1

你的问题是你永远不会调用函数,因为你的最大和最小变量是函数而不是数字。

您可以使用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

1

你减去两个功能,maxmin。所以函数首先被强制为原始值,然后被强制为数字,然后被减去。

当强制原语时,函数返回代码的实现相关字符串表示形式。很可能这不是一个数字的强制,所以你得到NaN,即非数字。减去NaN s产生NaN

也许你想跑IIFEs(立即调用的函数表达式),而不是:

// 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

+0

啊,明白了。我想在我的脑海里,我没有使用两个函数来操作,但是由两个函数min和max返回的值。 – DeeK

相关问题