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

IT技术 javascript arrays math max nan
2021-01-31 02:53:04

我试图从一个简单的数组中获得最高的数字:

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

alert(Math.max(data));

我已经读过,即使数组中的值之一无法转换为数字,它也会返回NaN,但在我的情况下,我已经仔细检查typeof以确保它们都是数字,那么我的问题是什么?

4个回答

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

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

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

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

Math.max.apply(Math, data);

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

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

正如你所看到的,每个参数现在都是一个有效的数字,所以它会按预期工作。

展开数组

你也可以传播数组这基本上将数组视为每个项目都作为它自己的参数被传递。

Math.max(...data);

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

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

如果未给出任何参数,则结果为 -Infinity。

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

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

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

你用一个参数调用这个函数-[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])

或者您可以使用新的点差运算符

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

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

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

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

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