在typeof()显示数字时获取NaN错误

时间:2018-03-13 13:27:43

标签: javascript

所以我正在编写这个非常简单的函数,我正在尝试返回它的结果,但我得到的只是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错误的结果?

4 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

由于this上下文未与该数组绑定,您可以按如下方式绑定它,此外,您需要对数组进行排序并获取最大值。

&#13;
&#13;
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])();
&#13;
<p id="app"></p>
&#13;
&#13;
&#13;

或者你可以传播阵列:

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

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

答案 3 :(得分:1)

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>