2016-10-06 5 views
2
내가 궁금

이유를 다음 작품 :자바 스크립트 비교 문자열 수

oldversion = "1.3.52"; 
newversion = "1.3.54"; 

if (newversion > oldversion) { 
    console.log('test'); 
} 

하지만이되지 않습니다 :

if (1.3.54 > 1.3.52) { 
    console.log('test'); 
} 

나는 그들이 실제 수는 없기 때문에 마지막 예제가 작동하지 않을 것이라는 점을 알고있다 . 하지만 지금까지 자바 스크립트가 숫자가있는 문자열을 만났을 때 어떤 일을하는지 알아 내려고 노력 중입니다.

이것은 내가 W3에서 찾을 것입니다 : 비교를 수행 할 때

번호와 문자열을 비교, 자바 스크립트는 숫자에 문자열을 변환합니다.

어떻게 문자열을 숫자로 변환하면 갑자기 Uncaught SyntaxError: Unexpected number이 표시되지 않습니까?

+1

'1.3.54' 이것은 숫자가 아니기 때문에 간단합니다. '1'은 숫자이거나 '1.3'은 숫자이지만 점을 더 추가하면 유효하지 않습니다. – vlaz

+0

나는이 점을 이해하고 있음을 알리기 위해 내 게시물에 명시되어 있습니다. 그렇다고해서 다른 예제가 효과가있는 이유는 설명하지 않습니다. 그것이 내가 알아 내고 싶은 것입니다. –

+1

그것은 단지 문자열 비교를하고 있습니다. 그래서 이것을 버전 검사에 사용하는 것은 잘못된 것입니다. – Keith

답변

3

당신은 세그먼트를 반복 처리하는 기능을 사용할 수 있습니다.

function checkVersion(a, b) { 
 
    var aa = a.split('.').map(Number), 
 
     bb = b.split('.').map(Number), 
 
     i, 
 
     r = 0, 
 
     l = Math.max(aa.length, bb.length); 
 

 
    for (i = 0; !r && i < l; i++) { 
 
     r = (aa[i] || 0) - (bb[i] || 0); 
 
    } 
 
    return r; 
 
} 
 

 
var oldversion = "1.3.52", 
 
    newversion = "1.3.54"; 
 

 
if (checkVersion(newversion, oldversion) > 0) { 
 
    console.log('test'); 
 
}

+0

오, 나는 그런 생각을 한 적이없는지도 (번호)를 좋아한다. 나는 지금 내 것을 수정하려고한다. 그러나 신용도 너 .. .. – Keith

1

주석에서 언급했듯이 실제로 문자열을 비교하고 숫자를 숫자로 변환하려고하지 않습니다.

당신은 시도하여 확인할 수 있습니다

var a = "a"; 
var b = "b"; 
console.log(a>b) // gives false 

var a = "a"; 
var b = "b"; 
console.log(b>a) // gives true 
+0

또한 1.21 ">"1.200 "'_looks_ correct (.200 =. 2 <.21)하지만 숫자 200을 취하면 21보다 훨씬 큽니다. 점을 다른 것으로 바꾸면 분명히 숫자 "1z21"> "1z200"'이됩니다. – vlaz

0

내가 생각 이해하기 쉬울 것 같은 니나의 솔루션은 허용 대답해야합니다 @. 어쨌든 .. 당신이 말하는 것처럼

function versionGreaterEqual(newversion, oldversion) { 
 
    var ov = oldversion.split('.').map(Number), //credit Nina :) 
 
     nv = newversion.split('.').map(Number); 
 
    return nv.reduce(function (a,b,i){ 
 
    return a+=b>=ov[i]; 
 
    },0)===nv.length; 
 
} 
 

 
console.log(versionGreaterEqual("1.3.54", "1.3.52")); //true 
 
console.log(versionGreaterEqual("1.3.54", "1.13.52")); //false

1

, 당신이 수와 문자열을 비교할 때, 문자열은 숫자로 변환됩니다. 다만, 캐릭터 라인에 무효 인 수가 포함되는 경우, 결과는 NaN가됩니다. 이 사실 때문에 재미입니다 : 그래서

NaN > 15 === false 
NaN < 15 === false 

: 분명히

"1.3.52" > 1.4 === false 
"1.3.52" < 1.4 === false 

(당신은 당신의 게시물에 말했듯이) 1.3.54와 1.3.52 예외가 있기 때문에 발생합니다 비교, 그들은 유효한 번호가 아닙니다.

"1.3.52"가 '1.12.10'보다 큰 이유는 무엇입니까?

문자열은 유니 코드 코드 포인트 순서를 사용하여 비교됩니다. 예를 들어 "바나나"는 "체리"앞에옵니다. "9"는 "80"보다 크지 만 "80"은 유니 코드 순서에서 "9"앞에옵니다. 따라서 "1.3.52"는 '1.12.10'보다 큰 것으로 해석됩니다.

문자열 사이의 순서를 찾고 속여서하지 않는 쉬운 방법은 sort를 사용하는 것입니다. 예를 들어, ["1.3.52", "1.12.10", "1.11.0.0.0"].sort()

+0

감사합니다. 안개를 지우는 데 sort()를 사용하는 것이 좋습니다. 무슨 일이 일어나는지 정확히 보여줘. 유니 코드 순서는 어떻게 점들 사이에서 작동합니까? 그것은 문자열 안에 모든 유니 코드 문자를 추가합니까? –

+0

주문을 결정하기 위해 그것을 추가한다고 생각하지 않습니다. 문제는 문자열의 문자 순서가 중요하다는 것입니다. 예를 들어 "2"> "12"=== true (첫 번째 문자가 중요합니다). 나는 다른 문자와 같은 점들을 다루는 것 같아요. 희망이 도움이됩니다. – acontell

+0

누군가가이 사실을 분명히 할 수 있기를 희망하지만 도움을 주셔서 감사합니다. 정말 감사합니다! –