为啥 math.max() 在整数数组上返回 NaN?

Posted

技术标签:

【中文标题】为啥 math.max() 在整数数组上返回 NaN?【英文标题】:Why is math.max() returning NaN on an array of integers?为什么 math.max() 在整数数组上返回 NaN? 【发布时间】:2015-12-15 07:34:28 【问题描述】:

我正在尝试从一个简单的数组中获取最大的数字:

data = [4, 2, 6, 1, 3, 7, 5, 3];

alert(Math.max(data));

我已经读到,即使数组中的一个值不能转换为数字,它也会返回 NaN,但在我的情况下,我已经仔细检查了 typeof 以确保它们是所有数字,那么我的问题是什么?

【问题讨论】:

见doc, about Math.max :-) 如果至少有一个参数不能转换为数字,则结果为NaN跨度> 在我看来,这不是一个有效的骗局。这个问题不是如何去做,而是更多为什么它不适用于数组。欺骗问题似乎没有回答这个问题 @musefan,所以你可能是对的 :-) 添加投票以重新打开 @musefan in one answer from dupe link aaroncrane.co.uk/2008/11/javascript_max_api 所以,它有点解释为什么:-) @Grundy:但链接不算数。它们是为了支持答案,而不是提供答案。该链接可能随时断开,尤其是当它看起来像是个人网站时 【参考方案1】:

如果您看到Math.max 的文档,您可以看到下一个描述

因为 max() 是 Math 的静态方法,所以您始终将其用作 Math.max(),而不是作为您创建的 Math 对象的方法(Math 不是构造函数)。

如果没有给出参数,则结果为 -Infinity。

如果至少有一个参数不能转换为数字,则结果为 NaN。

当您使用数组参数调用Math.max

Math.max([1,2,3])

您使用 one 参数调用此函数 - [1,2,3] 和 javascript 尝试将其转换为数字并获取 ("1,2,3" -> NaN) 失败. 所以结果符合预期 - NaN

注意: 如果数组只有 一个 数字 - 一切正常

 Math.max([23]) // return 23

因为[23] -> "23" -> 23 和转换为 Number 已完成。


如果你想从数组中获取最大元素,你应该使用apply 函数,比如

Math.max.apply(Math,[1,2,3])

或者您可以使用new spread operator

Math.max(...[1,2,3])

【讨论】:

【参考方案2】:

您的代码不起作用的原因是Math.max 期望每个参数都是有效数字。这在documentation 中表示如下:

如果至少有一个参数不能转换为数字,则结果为 NaN。

在您的实例中,您只提供 1 个参数,并且该 1 个值是一个数组而不是一个数字(它并没有检查数组中的内容,它只是停止知道它不是有效的号)。

一种可能的解决方案是通过传递参数数组显式调用函数。像这样:

Math.max.apply(Math, data);

这与手动指定每个参数而不使用数组的效果相同:

Math.max(4, 2, 6, 1, 3, 7, 5, 3);

如您所见,每个参数现在都是一个有效数字,因此可以按预期工作。

传播数组

您也可以spread the array。这基本上将数组视为每个项目都作为其自己的参数传递。

Math.max(...data);

【讨论】:

【参考方案3】:

如果你必须使用 Math.max 函数并且数组中的一个数字可能是未定义的,你可以使用:

x = Math.max(undefined || 0, 5)
console.log(x) // prints 5

【讨论】:

【参考方案4】:

它不起作用,因为您将数组作为参数而不是逗号分隔的数字传递。尝试像这样展开数组:

data = [4, 2, 6, 1, 3, 7, 5, 3];    
alert(Math.max(...data));

【讨论】:

以上是关于为啥 math.max() 在整数数组上返回 NaN?的主要内容,如果未能解决你的问题,请参考以下文章

关于Math.max对array.join()处理返回NaN

返回数组中的最大值,var arr = [2, 4, 6, 8, 5, 0]; alert(Math.max.apply(this, arr));

JS:Math 对象方法

Math.floor是啥?

从数组中获取最高整数

计算整数数组的差值