2017-04-19 11 views
0

다음 함수에서 코드는 숫자 대신 NaN을 반환합니다. 이 함수는 기본적으로 strarr에서 가져온 k 연속 문자열로 구성된 첫 번째 가장 긴 문자열의 길이를 계산합니다.Math.max 및 parseInt에서 오류가 발생했습니다.

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을 반환합니다. 이 함수는 기본적으로 배열 - strarr에서 취해진 k 개의 연속 문자열로 구성된 첫 번째 가장 긴 문자열의 길이를 계산합니다. 하지만 return Math.max(parseInt(arrI))을 사용하여 return Math.max(arrI) 줄을 바꾸면 코드가 올바르게 작동합니다.

제 질문은 그것이 중요하지 않다는 것입니다. 왜냐하면 arrI은 숫자가 아닌 문자열이지만 분명히 그렇기 때문입니다. 왜?

답변

2

Math.max은 배열을 취하는 것으로 정의되지 않으며, 이는 개별적인 인수를 취하는 것으로 정의됩니다.

어레이에 적용하려면 다음을 수행 할 수 있습니다. Math.max.apply(Math, arr). Math.max(...arr)

당신이 parseInt는, 문자열로 인수를 강제 변환이었다에서 parseInt을 던졌다 다음과 중지, 해당 문자열의 시작을 구문 분석 할 때 그것은 당신에게 NaN를 제공하지 않은 이유 : ES2015 +, 당신은 또한 확산 표기법을 사용할 수 있습니다 첫 번째 무효 한 문자와 지금까지 가지고 있던 것을 반환합니다. 배열을 문자열로 강제 변환하면 각 항목을 문자열로 변환 한 다음 쉼표로 결합합니다. 따라서 [1, 2, 3, 4]"1,2,3,4"이됩니다. parseInt은 그 중 1을 구문 분석합니다. 사실상, 당신은 Math.max(arr[0])을하고 있었는데, 그것은 당신이 찾고있는 것이 아닙니다.

0

Math.max은 각 숫자를 고유 한 매개 변수로 취합니다 : Math.max(1, 2, 3, 4...)입니다. 이것이 Math.max(arrI)이 NaN 인 이유입니다. 원하는 것은 다음과 같습니다 : Math.max.apply(null, arrI);.