将 1.3.52 和 1.3.54 作为字符串和数字进行比较

Comparing 1.3.52 and 1.3.54 as strings and as numbers

我想知道为什么以下内容有效:

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 在遇到其中包含数字的字符串时在做什么。

这是我在 W3Schools' JavaScript Comparison and Logical Operators page 上找到的:

When comparing a string with a number, JavaScript will convert the string to a number when doing the comparison.

那么为什么它将字符串转换为数字,突然间我不再得到 Uncaught SyntaxError: Unexpected number 了?

如评论中所述,它实际上是在进行字符串比较,而不是尝试将任何内容转换为数字。

您可以通过尝试验证这一点:

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

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

您可以使用迭代段的函数。

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');
}

@Nina 的解决方案应该是公认的答案,因为我认为它会更容易理解。但无论如何..

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

正如您所说,当您比较数字和字符串时,字符串会转换为数字。但是,如果字符串包含无效数字,则结果将为 NaN。这很有趣,因为:

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

所以:

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

显然(正如您在 post 中所说),将 1.3.52 与 1.3.54 进行比较会引发异常,因为它们不是有效数字。

为什么“1.3.52”被解释为大于“1.12.10”?

使用 Unicode 代码点顺序比较字符串。例如,"Banana" 在 "cherry" 之前。 “9”比“80”大,但因为“80”在 Unicode 顺序中排在“9”之前。因此,“1.3.52”被解释为大于“1.12.10”。

找出字符串之间的顺序而不被欺骗的一种简单方法是使用排序。例如,["1.3.52", "1.12.10", "1.11.0.0.0"].sort()