Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将1.3.52和1.3.54作为字符串和数字进行比较_Javascript_Comparison_String Comparison - Fatal编程技术网

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

Javascript 将1.3.52和1.3.54作为字符串和数字进行比较,javascript,comparison,string-comparison,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遇到一个包含数字的字符串时,它在做什么 这是我在

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

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将转换 进行比较时将字符串设置为数字


那么,为什么它会将字符串转换为数字,突然我就不再得到一个未捕获的语法错误:意外的数字了?

正如评论中提到的,它实际上是在进行字符串比较,而不是试图将任何东西转换成数字

您可以通过尝试以下操作来验证这一点:

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

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

您可以使用一个函数来迭代这些段

功能检查版本(a、b){
var aa=a.split('.').map(编号),
bb=b.拆分('.')。映射(编号),
我
r=0,
l=数学最大值(aa.长度,bb.长度);
对于(i=0;!r&&i0){
console.log('test');

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

函数版本CreateRequal(新版本、旧版本){
var ov=oldversion.split('.').map(编号),//贷记Nina:)
nv=newversion.split('.').map(编号);
返回nv.reduce(函数(a、b、i){
返回a+=b>=ov[i];
},0)==nv.长度;
}
日志(VersionCreateRequal(“1.3.54”、“1.3.52”)//真的

日志(VersionCreateRequal(“1.3.54”、“1.13.52”)//false
正如您所说,当您比较数字和字符串时,字符串将转换为数字。但是,如果字符串包含无效数字,则结果将为NaN。这很有趣,因为:

NaN > 15 === false
NaN < 15 === false
NaN>15===false
NaN<15==false
因此:

“1.3.52”>1.4===false
“1.3.52”<1.4==false
显然(正如你在文章中所说的),比较1.3.52和1.3.54会抛出一个异常,因为它们不是有效的数字

为什么“1.3.52”的解释大于“1.12.10”

字符串使用Unicode代码点顺序进行比较。例如,“香蕉”在“樱桃”之前。“9”比“80”大,但因为在Unicode顺序中“80”在“9”之前。因此,“1.3.52”被解释为大于“1.12.10”


找到字符串之间的顺序并且不被欺骗的一个简单方法是使用sort。例如,
[“1.3.52”、“1.12.10”、“1.11.0.0.0”].sort()

1.3.54
这不是一个数字,就这么简单
1
是一个数字或
1.3
是一个数字,但添加更多的点无效。它只是进行字符串比较。。因此,使用它进行版本检查是错误的。对于您测试过的字符串,“它是有效的”。尝试
1.23.5
vs
1.3.5
…上次我检查12大于3:)@Keith OP对字典比较感到困惑,就像Javascript一样…:DAlso
“1.21”>“1.200”
看起来只正确(因为.200=.2<.21),但如果你取整数,200肯定大于21。用任何东西替换点,它就变得明显了。
“1z21”>“1z200”
-它不是真正检查数字,而是检查每个字符。哦,我喜欢地图(数字),从来没有想过。。我现在要修改我的。。但也要归功于你……)谢谢,这对使用sort()清除迷雾和向我展示正在发生的事情非常有帮助。但是,unicode顺序如何处理中间的点?它把字符串中所有的unicode字符加起来了吗?我不认为它把它们加起来是为了决定顺序。问题是,字符串中字符的顺序很重要。例如“2”>“12”==true(第一个字符很重要)。我认为它把点当作另一个角色。希望有帮助。希望有人能澄清这是真的,但谢谢你的帮助。真的很感激!
"1.3.52" > 1.4 === false
"1.3.52" < 1.4 === false