【问题标题】:Getting NaN error while typeof() shows number [duplicate]typeof()显示数字时出现NaN错误[重复]
【发布时间】:2018-08-21 18:48:00
【问题描述】:

所以我正在编写这个非常简单的函数并尝试返回它的结果,但我得到的只是NaN 错误。

这是我当前的代码:

function m(c) {
    return Math.max(c) - this.length - 1;
}


document.getElementById('app').innerHTML = m([1,4,6,8,43,2]);
<p id="app">

</p>

当我改为return typeof(a - this.length -1); 时,我得到一个number 结果。

    function m(c) {
        return typeof(Math.max(c) - this.length - 1);
    }


    document.getElementById('app').innerHTML = m([1,4,6,8,43,2]);
<p id="app">

</p>

所以我的问题是,如果我的 return 语句的类型是数字,为什么我会收到 NaN 错误?

@edit 问题 2。我有没有办法更改函数以显示结果而不会出现 NaN 错误?

【问题讨论】:

  • Math.max(c) 应该做什么?
  • 什么是this?请同时添加想要的结果。

标签: javascript


【解决方案1】:

NaN 属于 number 类型:

console.log(typeof NaN)

您获得NaN 的原因是您不能只在数组上调用Math.max。 (试试Math.max([1,2]))。您需要使用spread operator (...)。

另外,我假设您打算使用数组的长度,因为 this.length 没有引用任何内容。:

function m(c) {
    return Math.max(...c) - c.length - 1;
}


console.log(m([1,4,6,8,43,2]));

如果您需要support older browsers,请将Math.max(...c) 替换为:

Math.max.apply(null, c)

【讨论】:

    【解决方案2】:

    您必须使用Math.max.apply(null, c)。 Math.max 接受数字列表,而不是数组。这就是为什么您必须使用 apply 来将数组用作参数列表。

    【讨论】:

    • Mdn 文档:但是,如果数组元素过多,spread (...) 和 apply 都将失败或返回错误结果,因为它们试图将数组元素作为函数参数传递。有关更多详细信息,请参阅使用 apply 和内置函数。 reduce解决方案没有这个问题。
    【解决方案3】:

    this.length 未定义。将其替换为 c.length。

    另外,math.max 并不像你想象的那样工作。 如果您查看mdn docs,您会发现他们建议为数组使用reduce 函数。

    但是,如果数组元素过多,spread (...) 和 apply 都将失败或返回错误结果,因为它们试图将数组元素作为函数参数传递。有关更多详细信息,请参阅使用 apply 和内置函数。 reduce 解决方案没有这个问题。

    简而言之。

    function m(c) {
       
        var max = c.reduce(function(a, b) {
            return Math.max(a, b);
        });
        return max - c.length - 1;
    }
    
    
    document.getElementById('app').innerHTML = m([1,4,6,8,43,2]);
    <p id="app">
    
    </p>

    【讨论】:

    【解决方案4】:

    因为this上下文没有绑定到那个数组,所以可以如下绑定,另外,还需要对数组进行排序,取最大值。

    function m() {
      var [max] = this.sort((a, b) => b - a);
      return max - this.length - 1;
    }
    
    document.getElementById('app').innerHTML = m.bind([1, 4, 6, 8, 43, 2])();
    &lt;p id="app"&gt;&lt;/p&gt;

    或者你可以展开数组:

    function m(c) {
      return Math.max(...c) - c.length - 1;
    }
    
    document.getElementById('app').innerHTML = m([1, 4, 6, 8, 43, 2]);
    &lt;p id="app"&gt;&lt;/p&gt;

    【讨论】:

    • sort 获取最大值? .bind 解决滥用this 的问题?我建议改变 OP 的方法,而不是让他们的黑客“工作”。
    猜你喜欢
    • 1970-01-01
    • 2020-06-06
    • 2017-02-06
    • 2013-06-22
    • 2010-12-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多