我试图从一个简单的数组中获得最高的数字:
data = [4, 2, 6, 1, 3, 7, 5, 3];
alert(Math.max(data));
我已经读过,即使数组中的值之一无法转换为数字,它也会返回NaN
,但在我的情况下,我已经仔细检查typeof
以确保它们都是数字,那么我的问题是什么?
我试图从一个简单的数组中获得最高的数字:
data = [4, 2, 6, 1, 3, 7, 5, 3];
alert(Math.max(data));
我已经读过,即使数组中的值之一无法转换为数字,它也会返回NaN
,但在我的情况下,我已经仔细检查typeof
以确保它们都是数字,那么我的问题是什么?
您的代码不起作用的原因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