最近的項目中,后端給我返回來數字是字符串形式的,而根據實際業務需求,我需要進行比較大小。
而我當時考慮的是,js本身屬於弱類型,動態語言
弱類型:
在編程語言中,語言被分為強類型和弱類型,我們將支持隱式轉換的語言稱為弱類型語言,不支持隱式轉換的語言稱為強類型語言,
而js本身開發出來之際由於各種機緣巧合,讓他成為一個弱類型的語言。他有利有弊
動態語言:
在聲明變量之前需要先定義變量類型。我們把這種在使用之前就需要確認其變量數據類型的稱為靜態語言。
相反地,我們把在運行過程中需要檢查數據類型的語言稱為動態語言。而JavaScript 就是動態語言,因為在聲明變量之前並不需要確認其數據類型。
我當時想的就是,即使用數字字符串比較大小,js也會隱士轉換成對應的數字,但是我確犯了錯誤。
我發現在相同長度時,比較后得到的結果是正確的的,但是當長度不一樣時就有了問題,看下面得情況
'32' < '55' // true '1' < '2' // true '32' < '128' // false
按理說128是大於32的,但是確是false。這就很尷尬了
后來通過強大的網絡發現了這么一個大秘密:
1、純字符串比較,轉換成ASCII碼在進行比較;
2、純數字和純數字字符串相比較,則將字符串數字隱式轉換成數字再進行比較;
3、純數字和非純數字字符串比較,都返回false;
當使用純字符串比較時,js會把它轉換成ASCII碼比較,而不是轉成數字,只有使用純數字和非純數字的時候才會隱式轉換成數字,心里面萬馬奔騰
同時需要注意
1.數字和字符串比較大小,js會優先將字符串轉成數字來比較(如果將數字轉成字符串,那么還要將字符串轉成字符編碼才能比較,但是將字符串轉成數字就可以直接比較了)
2.非純數字字符串會被轉成NaN,關於NaN:
a. NaN是數字類型,typeof NaN === ‘number’
b. NaN不等於任何數值,包括它本身,只能用isNaN()來判斷
參考👏😬