在以下函数中,我的代码返回NaN
,而不是数字。此函数基本上计算第一个最长字符串的长度,该字符串由数组中的k
个连续字符串组成 - strarr
。
function longestConsec(strarr, k) {
var n = strarr.length;
if(n === 0 || n < k || k<=0){
return "";
}
else{
var arrI = [0,0,0,0];
var max;
for (var i = 0; i<(strarr.length - k); i++){
for(var j = i; j<(i+k); j++){
arrI[i] += strarr[j].length;
}
}
max = arrI.indexOf(Math.max(arrI));
return Math.max(arrI) //typeof(arrI[i]) for i {0,1,2,3} returns 'number' and arrI.length returns 4
}
}
console.log(longestConsec(["zone", "abigail", "theta", "form", "libe", "zas"], 2), "abigailtheta")
在上面的函数中,我的代码返回NaN而不是数字。
此函数基本上计算第一个最长字符串的长度,该字符串由数组中的k个连续字符串组成 - strarr。但是,如果我将return Math.max(arrI)
行替换为return Math.max(parseInt(arrI))
,那么我的代码就可以正常运行。
我的问题是它不应该重要,因为arrI
是一个数字数组,而不是字符串,但显然它确实如此。为什么呢?
答案 0 :(得分:2)
Math.max
未被定义为采用数组,它被定义为采用离散参数。
如果要将其应用于数组,您可以:Math.max.apply(Math, arr)
。在ES2015 +中,您还可以使用扩展表示法:Math.max(...arr)
当你向NaN
投掷parseInt
时它没有给你parseInt
的原因是[1, 2, 3, 4]
强制其参数为字符串,然后解析该字符串的开头,停止第一个无效字符,并返回到目前为止的内容。当您将数组强制转换为字符串时,它会将每个条目强制转换为字符串,然后用逗号连接它们,因此例如"1,2,3,4"
变为parseInt
。 1
将解析Math.max(arr[0])
。实际上,你正在做$("#myLink").click(function(e){
e.preventDefault();
addProduct(e.target);
});
,这不是你想要的。
答案 1 :(得分:0)
问题是,Math.max
将每个数字作为自己的参数:Math.max(1, 2, 3, 4...)
。这就是Math.max(arrI)
是NaN的原因。您想要的是以下内容:Math.max.apply(null, arrI);
。