所以我正在编写这个非常简单的函数,我正在尝试返回它的结果,但我得到的只是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错误的结果?
答案 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
上下文未与该数组绑定,您可以按如下方式绑定它,此外,您需要对数组进行排序并获取最大值。
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;
或者你可以传播阵列:
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;
答案 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>