js 字符串比较大小
按每个字符的 charCode 大小进行比较,直到分出大小为止
demos
{
let a = 'a11'
let b = 'a2'
console.log(a > b) // false
}
a 和 b 比较,步骤如下:
- a[0]='a', b[0]='a', 他们的 charCode 相等,所以比较下一项
- a[1]='1', b[1]='2', 1 的 charCode 是 49, 2 的是 50, 所以 a[1] < b[1]
- 所以 a < b
console.log('选择' > '努力') // true
因为 "选" 的 charCode 是 36873,"努" 的 charCode 是 21162
版本号比较大小
常见版本号 0.0.1
等,当某些特定情况下,如要进行版本号大小对比。因此有人会采用上述办法来比较。但是会有 bug。
{
let v1 = '9.1.21'
let v2 = '7.1.1.28'
console.log(v1 > v2) // true
}
{
// v2 实际上是大于 v1
let v1 = '9.1.21'
let v2 = '10.1.1.28'
console.log(v1 > v2) // true
}
为了修复此 Bug,我写了一个函数:
// 对比版本号大小
function isBiggerVersion(v1, v2) {
var result = true
var array1 = v1.split('.')
var array2 = v2.split('.')
var isFirstLonger = array1.length >= array2.length
function _bigger(longer, shorter) {
var l = ~~(longer[0] || 0)
var s = ~~(shorter[0] || 0)
if (s >= l) {
return false
}
if (s < l) {
return true
}
if (s === l) {
longer.shift()
shorter.shift()
return _bigger(longer, shorter)
}
}
return isFirstLonger ? _bigger(array1, array2) : !_bigger(array2, array1)
}
下面是测试:
{
let v1 = '9.1.21'
let v2 = v1
console.log(isBiggerVersion(v1, v2)) // false
}
{
let v1 = '9.1.21'
let v2 = '10.1.1.28'
console.log(isBiggerVersion(v1, v2)) // false
}
{
let v1 = '9.1.21'
let v2 = '10.0.1.28'
console.log(isBiggerVersion(v1, v2)) // false
}
{
let v1 = '9.1.21'
let v2 = '9.0.1.28'
console.log(isBiggerVersion(v1, v2)) // true
}
{
let v1 = '9.1.21'
let v2 = '9.1.1.28'
console.log(isBiggerVersion(v1, v2)) // true
}
{
let v1 = '9.1.21'
let v2 = '8.1.1.28'
console.log(isBiggerVersion(v1, v2)) // true
}
{
let v1 = '9.1.21'
let v2 = '8.1'
console.log(isBiggerVersion(v1, v2)) // true
}
{
let v1 = '9.1.21'
let v2 = '10.1'
console.log(isBiggerVersion(v1, v2)) // false
}