Javascript 用于比较major.minor.patch字符串的数组reduce函数

Javascript 用于比较major.minor.patch字符串的数组reduce函数,javascript,arrays,Javascript,Arrays,我遇到了一些奇怪的事情,我不明白为什么它会起作用。以下代码工作正常,始终返回最大版本,直到修补程序级别。尽管我们将每个版本字符串作为整数/数字进行比较。有人能解释一下它为什么会这样吗 var versionArr=['4.2.2'、'4.2.1'、'3.1.0'、'3.2.1'、'3.0.0']; console.log(versionArr.reduce((acc,item)=>acc>item?acc:item))在Javascript中比较字符串默认为按字典顺序进行比较。巧合的是,词典排

我遇到了一些奇怪的事情,我不明白为什么它会起作用。以下代码工作正常,始终返回最大版本,直到修补程序级别。尽管我们将每个版本字符串作为整数/数字进行比较。有人能解释一下它为什么会这样吗

var versionArr=['4.2.2'、'4.2.1'、'3.1.0'、'3.2.1'、'3.0.0'];

console.log(versionArr.reduce((acc,item)=>acc>item?acc:item))在Javascript中比较字符串默认为按字典顺序进行比较。巧合的是,词典排序的工作原理与语义版本排序的工作原理非常接近。它比较第一个字符,较大的数字比较小的数字“大”。如果它们不同,则进行比较。如果它们相同,则转到第二个字符并再次比较。等等,直到它遇到两个不同的字符

所以比较
4.2.2
4.2.1
,它比较
4
4
,看到它们是一样的,然后比较
,看到它们是一样的,然后比较
2
2
,看到它们是一样的,比较
,看到它们是一样的,然后最后比较
2
1
,报告2大于1,因此
4.2.2
大于
4.2.1


但是,这对于任何中等复杂的版本都不起作用。例如,如果其中一个组件的值大于9,则它将断开。比较
10.0.0
9.0.0
会将
9.0.0
报告为较大的版本,因为9大于1。

一旦进入两位数版本号,它将不起作用。出于所有目的,您可以在本例中考虑按字母顺序排序(尽管字符串比较有相当多的细微差别)。但是,如果以相同的方式将
“10”
“9”
进行比较,
9
将更大,因为
9>1
。这种行为是javascript关系运算符的特殊规则之一,可以找到一些特殊规则的列表。从技术上讲,unicode字符代码用于英文字母、数字、,基本符号相当于ASCII码。对于“特殊”角色来说,它变得更加棘手。@DavidSampson是的,我现在真的明白了。谢谢你的详细回答。这完全有道理。