2016-11-05 44 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

相關問題