使用Math.max和parseInt遇到错误

时间:2017-04-19 12:51:04

标签: javascript arrays parseint

在以下函数中,我的代码返回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是一个数字数组,而不是字符串,但显然它确实如此。为什么呢?

2 个答案:

答案 0 :(得分:2)

Math.max未被定义为采用数组,它被定义为采用离散参数。

如果要将其应用于数组,您可以:Math.max.apply(Math, arr)。在ES2015 +中,您还可以使用扩展表示法:Math.max(...arr)

当你向NaN投掷parseInt时它没有给你parseInt的原因是[1, 2, 3, 4]强制其参数为字符串,然后解析该字符串的开头,停止第一个无效字符,并返回到目前为止的内容。当您将数组强制转换为字符串时,它会将每个条目强制转换为字符串,然后用逗号连接它们,因此例如"1,2,3,4"变为parseInt1将解析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);