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是的,我现在真的明白了。谢谢你的详细回答。这完全有道理。