获得NaN作为我的JS函数的结果.有人能解释一下原因吗?
Getting NaN as a result for my JS function. Could anyone explain why?
我是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吗?
您正在减去两个函数,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
你的问题是你从来没有调用过函数,因为你的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;
}
相关文章:
- 你能解释一下这个阶乘函数是如何工作的吗?
- 你能解释一下为什么这个javascript不正确吗
- 有人能解释一下evaluate()和dragAndDrop()在下面的角度测试代码中调用了什么吗
- 你能解释一下下面的javascript吗?
- 有人能解释一下;r'的对象在下面的代码示例中执行
- 谁能解释一下这句话的意思吗;var upload_file_count_text=+filenames.length++
- 有人能解释一下如何#ifeq吗/section键使用handle.js工作
- 你能解释一下第 3 章 Eloquent js 中的这个递归解决方案吗?
- 你能解释一下 javascript 中的返回吗?
- 你能解释一下这种奇怪的函数声明行为吗?
- 用“i”替换字符串中的元音..你能解释一下这个表达吗?someText.replace(/[aAeEoOuU]/ig,“
- 你能解释一下jQuery如何同时使用$作为函数和对象吗?
- 你能解释一下ngList指令吗?
- 你能解释一下这个JavaScript语法(变量外推)吗?
- 谁能解释一下这个 ajax .each 函数中的项目来自哪里
- 今天有人能解释一下吗.getDate()>25?5:(today.getDate()>16?25:15)
- 有人能解释一下这个require.js示例中涉及的语法吗
- 有人能解释一下这个JavaScript代码吗
- 有人能解释一下这个递归JS代码来计算指数吗
- 有人能解释一下下面的javascript RE代码吗