2016-10-06 3 views
2
私は疑問に思って

理由を、次の作品:Javascriptを比較する文字列の数

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

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

しかし、これにはない:

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

私は、彼らが実際の数値ではないので、最後の例では動作しないことを知っています。しかし、これまでのところ、javascriptが数字の入った文字列に遭遇したときに、javascriptが何をしているのかを調べようとしています。

これは私がW3で見つけたものです:

数の文字列を比較する場合の比較を行う際に、JavaScriptは数値に 文字列を変換します。

文字列を数字に変換すると、突然私は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」よりも大きいと解釈されるのですか?

文字列は、Unicodeコードポイント順を使用して比較されます。たとえば、「バナナ」は「チェリー」の前にあります。 "9"は "80"より大きいが、 "80"はUnicode順で "9"の前に来るため。したがって、「1.3.52」は「1.12.10」より大きいと解釈されます。

文字列間の順序を見つけて、騙されないようにする簡単な方法は、sortを使用することです。例えば、["1.3.52", "1.12.10", "1.11.0.0.0"].sort()

+0

ありがとうございました。何が起きているか正確に私に教えてください。ユニコードの注文はどうやってドットの間で動作するのですか?それは文字列の中にすべてのユニコード文字を追加しますか? –

+0

私は注文を決めるためにそれを追加するとは思わない。事は、文字列内の文字の順序が重要です。たとえば "2"> "12" === true(最初の文字が問題)。私はそれが別のキャラクターのように点を扱うと思う。それが役に立てば幸い。 – acontell

+0

誰かがこれが本当に真実であることを明らかにしたいと思っていますが、助けてくれてありがとう。心から感謝する! –