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

时间:2016-10-06 12:08:13

标签: javascript comparison string-comparison

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

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上找到的:

  

将字符串与数字进行比较时,JavaScript会转换   在进行比较时将字符串转换为数字。

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

4 个答案:

答案 0 :(得分: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');
}

答案 1 :(得分: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

答案 2 :(得分:1)

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

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

所以:

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

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

为什么&#34; 1.3.52&#34;被解释为大于&#39; 1.12.10&#39;?

使用Unicode代码点顺序比较字符串。例如,&#34; Banana&#34;来到&#34; cherry&#34;之前。 &#34; 9&#34;大于&#34; 80&#34;,但是因为&#34; 80&#34;来之前&#34; 9&#34;按Unicode顺序。因此,&#34; 1.3.52&#34;被解释为大于&lt; 1.12.10&#39;。

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

答案 3 :(得分:0)

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

export class MyCustomElement {
    @bindable title = 'Hello, World!';

    constructor () {
    }
}