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);.