【问题标题】: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:但链接不算数。它们是为了支持答案,而不是提供答案。该链接可能随时断开,尤其是当它看起来像是个人网站时

标签: javascript arrays math max nan


【解决方案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));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-16
          • 2018-10-24
          • 2021-06-28
          • 2011-02-17
          • 1970-01-01
          相关资源
          最近更新 更多