a>b的那些事

RobinsonZhang發表於2018-08-06

前言

經常會遇到對比兩個值大小關係的邏輯,常規的處理中我們都是處理兩個數字或者數字型別的字串。那麼這裡進行延伸擴充的練習,來避免一些開發中的採坑。

起因

起因是自己在看《vuejs權威指南》裡看到表單驗證裡,也就是validator.js裡可以驗證最小最大值的原始碼部分。

原始碼裡針對最小值的寫法是這樣的:

export default  min (val, areg){
return !isNaN(val) && !isNaN(areg) && +(val)>= +(areg)
}
複製程式碼

在上面的程式碼裡我們可以看到嚴謹的判斷了,兩個比較型別均是可以轉為數字型別的判斷。然後第三個判斷就有點不是很理解了,兩個都加加號是什麼操作?

基礎回顧

我們知道+操作符除了一些基本的數字的運算,還支援一些其他的功能。

1 前面為數字,後面為數字的字串,兩者相加,會得到字串的相加。

let a = 1 , b ='2'
let c = a + b
console.log(c) //12
複製程式碼

2 如果兩者都是字串,那麼得到是字串的相加,也就是我們之前es5最熟悉的字串拼接方式。

額外發現

  • 支援數字型的字串型別的轉換,我們用typeof方法去判斷+b的資料型別時,發現已經轉變為了Number型別
let a = 1 , b ='2'
let c = a + +(b)
console.log(c) //3 ,
複製程式碼
  • 那麼既然加法不支援數字型別與字串的運算,減法是否支援呢?

通過程式碼嘗試,我們發現無論是數字減去字串型的數字,還是字串型的數字互相減,都是可以得到想要的結果,而不是和加法一樣會有時去按照拼接字串處理。

let a = "2" ,b= '20',c=34 ,d='2'

document.write(a - b)
document.write(c - d)
document.write(b - c)
複製程式碼
  • 進一步,我們嘗試用減法是否可以改變資料的型別。

結果表明,-(a)操作也是可以改為資料型別的字串改為數字的。但是其中是有一個潛在的問題的,就是-在轉換的時候,如果值為負數,轉換得到的是其相反數,這個不是我們期望的。

所以從這點在回看,用+做數字或者非數字的不區分轉換是比較ok的。

用>判斷大小是否合理

用> 判斷兩個確定為數字的沒有任何問題,等效於數學意義的比較

用於比較數字和非數字是否合理

比如我們經常舉例的,'20' > '100',其返回的結果是true,明顯不符合預期,所以我們比較大小的時候多數這樣寫的:a-b>0,這樣比較大小沒有問題。

>如果比較兩個字串比較的是什麼

其比較的內容是 :按字元在unicode中的碼位來比較大小。所以一般情況下比較兩個字元竄的大小麼有實際可用的意義。

總結

通過本文我們看到了比較兩個類數字的嚴謹的方式方法,也知道了+運算子可以沒有難度的幫我們把數字型的字串轉為數字型別;如果你不習慣這樣比較,也可以用a-b的減法操作進行。

彩蛋

延伸與擴充

在array的sort方法中,相信你還記得起比較大小順序的語法是這樣的。這裡不是用a>b比較的,因為直接用大於無法比較出真正想要的大小,所以一般是a-b。

arr.sort((a, b ) =>{
return a-b 
})
複製程式碼

isNaN的擴充

既然提到了NaN,我們順便回憶下,哪些型別是我們容易遺漏的NaN型別。

  • 以下常見的型別或者值都是NaN型別哦,返回為true. 空物件,undefined,NaN,字元,字母等,日期的字串形式等。

  • 而以下則會轉成數字,返回false. 比如布林型的true,false,新建日期,空字串,null,空陣列