我遇到了一些奇怪的事情,但是为什么它起作用却我还是不太明白。以下代码可以正常工作,并且始终返回最高版本,直到补丁程序级别为止。尽管我们将每个版本字符串都作为整数/数字进行比较。有人可以向我解释为什么它的行为方式如此吗?
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));
答案 0 :(得分:2)
在Javascript中比较字符串默认是按字典顺序比较它们。巧合的是,词典编目排序与语义版本排序的工作原理非常接近。它比较第一个字符,较大的数字比较小的数字“更大”。如果它们不同,则进行比较。如果它们相同,则转到第二个字符并再次进行比较。依此类推,直到遇到两个不同的字符。
因此,比较4.2.2
和4.2.1
,比较4
和4
,发现它们相同,然后比较.
和.
,看到它们相同,然后比较2
和2
,看到它们相同,比较.
和.
,发现它们相同,然后最后比较{ {1}}和2
报告2大于1 ergo 1
大于4.2.2
。
但是,这不适用于任何中等复杂的版本。例如,如果一个分量大于9,则会中断。比较4.2.1
和10.0.0
将报告9.0.0
为较大的数字,因为9大于1。