Math.max 和 parseInt 遇到错误
Experiencing error with Math.max and parseInt
在下面的函数中,我的代码是returnsNaN
,而不是数字。这个函数基本上计算第一个最长的字符串的长度,该字符串由数组中的 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")
在上面的函数中,我的代码是 returns NaN,而不是数字。
这个函数基本上是计算第一个最长的字符串的长度,该字符串由数组中的 k 个连续字符串组成 - strarr。但是,如果我用 return Math.max(parseInt(arrI))
替换 return Math.max(arrI)
行,那么我的代码可以正常工作。
我的问题是这应该无关紧要,因为 arrI
是一个数字数组,而不是字符串,但显然它确实如此。为什么?
Math.max
未定义为采用数组,它被定义为采用离散参数。
如果你想将它应用到数组中,你可以:Math.max.apply(Math, arr)
。在 ES2015+ 中,还可以使用扩展符号:Math.max(...arr)
当你向它扔 parseInt
时它没有给你 NaN
的原因是 parseInt
将它的参数强制转换为字符串,然后解析该字符串的开头,在第一个无效字符处停止,并返回到目前为止的内容。当您将数组强制转换为字符串时,它会将每个条目强制转换为字符串,然后用逗号连接它们,例如 [1, 2, 3, 4]
变为 "1,2,3,4"
。 parseInt
将从中解析出 1
。实际上,您正在做 Math.max(arr[0])
,这不是您要查找的内容。
问题是,Math.max
将每个数字作为自己的参数:Math.max(1, 2, 3, 4...)
。这就是为什么 Math.max(arrI)
是 NaN。您想要的是以下内容:Math.max.apply(null, arrI);
.
在下面的函数中,我的代码是returnsNaN
,而不是数字。这个函数基本上计算第一个最长的字符串的长度,该字符串由数组中的 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")
在上面的函数中,我的代码是 returns NaN,而不是数字。
这个函数基本上是计算第一个最长的字符串的长度,该字符串由数组中的 k 个连续字符串组成 - strarr。但是,如果我用 return Math.max(parseInt(arrI))
替换 return Math.max(arrI)
行,那么我的代码可以正常工作。
我的问题是这应该无关紧要,因为 arrI
是一个数字数组,而不是字符串,但显然它确实如此。为什么?
Math.max
未定义为采用数组,它被定义为采用离散参数。
如果你想将它应用到数组中,你可以:Math.max.apply(Math, arr)
。在 ES2015+ 中,还可以使用扩展符号:Math.max(...arr)
当你向它扔 parseInt
时它没有给你 NaN
的原因是 parseInt
将它的参数强制转换为字符串,然后解析该字符串的开头,在第一个无效字符处停止,并返回到目前为止的内容。当您将数组强制转换为字符串时,它会将每个条目强制转换为字符串,然后用逗号连接它们,例如 [1, 2, 3, 4]
变为 "1,2,3,4"
。 parseInt
将从中解析出 1
。实际上,您正在做 Math.max(arr[0])
,这不是您要查找的内容。
问题是,Math.max
将每个数字作为自己的参数:Math.max(1, 2, 3, 4...)
。这就是为什么 Math.max(arrI)
是 NaN。您想要的是以下内容:Math.max.apply(null, arrI);
.