将 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()
我想知道为什么以下内容有效:
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()