为什么math.max()返回带有整数数组的NaN?

Mat*_*der 32 javascript arrays math max nan

我试图通过一个简单的方法得到最高的数字NaN:

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

alert(Math.max(data));
Run Code Online (Sandbox Code Playgroud)

我已经读过如果数组中的一个值无法转换为数字,它将返回typeof,但在我的情况下,我已经仔细检查NaN以确保它们都是数字,所以可能是我的问题?

mus*_*fan 57

您的代码无效的原因是因为Math.max期望每个参数都是有效数字.这在文档中表明如下:

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

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

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

Math.max.apply(Math, data);
Run Code Online (Sandbox Code Playgroud)

这实际上做的就像手动指定每个没有数组的参数一样:

Math.max(4, 2, 6, 1, 3, 7, 5, 3);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,每个参数现在都是一个有效数字,因此它将按预期工作.


Gru*_*ndy 23

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

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

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

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

Math.max用数组参数调用时

Math.max([1,2,3])
Run Code Online (Sandbox Code Playgroud)

你用一个参数调用这个函数- [1,2,3]然后javascript尝试将它转换为数字并获得("1,2,3" - > NaN)失败.
结果如预期 - NaN

注意:如果只有一个数字的数组- 都正常工作

 Math.max([23]) // return 23
Run Code Online (Sandbox Code Playgroud)

因为[23] -> "23" -> 23和隐藏到数字已完成.


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

Math.max.apply(Math,[1,2,3])
Run Code Online (Sandbox Code Playgroud)

或者您可以使用新的传播运营商

Math.max(...[1,2,3])
Run Code Online (Sandbox Code Playgroud)


Bij*_*raj 10

它不起作用,因为您传递数组作为参数而不是逗号分隔数字.尝试像这样传播数组:

data = [4, 2, 6, 1, 3, 7, 5, 3];    
alert(Math.max(...data));
Run Code Online (Sandbox Code Playgroud)