JavaScript關於數位那些事

來源:互聯網
上載者:User

編程中無可避免地要和數字打交道,但在 JavaScript 中,對數位操作往往在某些時候可能會讓人感到一些迷惑,比如說 parseInt 方法就是一個典型的例子。

1. parseInt 的進位問題

parseInt 是 JavaScript 中非常常用的一個方法,它用來將數字型的字串轉換為數字類型的整數,一般使用這個函數不會出現什麼問題,但有些情況例外,比如要轉換的字串為 "08","09"。下面的代碼展示了 parseInt 處理字串"08"時不同的返回結果。導致這種結果的原因在於,可能很少有人注意到 parseInt 方法實際上有兩個參數,第一個是要轉換為數位字串,第二個選擇性參數為轉換的進位值,如果沒有提供第二個參數,則首碼為 '0x' 的字串被當作十六進位,首碼為 '0' 的字串被當作八進位。所有其它字串都被當作是十進位。這就造成了parseInt("08")的結果為0,而parseInt("8")結果為8的怪 異現象,解決的辦法很簡單:為該方法明確地指明參數。

var t_1_a = "08";parseInt(t_1_a);   // 0parseInt(t_1_a,10);   // 8
2. 0 除以 0 與 1 除以 0

在進行除法運算的時候,如果事先不知道參與運算的兩個數字,那麼有可能遇到類似 0/0 和 1/0 的情況。感謝數學老師,他讓我們知道了 n/0 (n!=0)是一個極限數,於是理所當然地,在 JavaScript 中,當 n大於0 時,這個運算式的運算結果是 Infinity,n小於0 時,結果為 -Infinity。不要以為我在這裡隨便寫了一個單詞,Infinity 是 Global 對象的成員,事實上它的資料類型依然為"number"。而當 n = 0 時,即 0/0 ,這個運算的結果是 NaN,它是個特殊的傢伙。避免這種情況,一種辦法是檢查參與運算的數字,另一種辦法是檢測運算結果。

1/0   // Infinity0/0   // NaN
3. 數位檢測: isNaN 與 isFinite

剛才我們認識到了一種可能產生 Infinity 和 NaN 的情況,但在實際中,可能導致這種結果的例子很多,比如一個使用者表單,其中的一個域只能填寫數字,如何檢測到使用者的不合法填寫,並保障有效運算並返回給用 戶。先說 NaN 的情況吧,它 比 Infinity 稍顯複雜,NaN 用來表示非數字值的特殊值,同 Infinity 一樣,它也是 Global 對象的成員。NaN 不與任何值相等,包括其本身,這已經否定了我們使用 "==" 來檢測 NaN 的可能,而 typeof NaN 的結果也是 "number",這使我們無法將它與常規的數字區分開。

typeof NaN;   // number"test" == NaN;   // false5 == NaN;    // falseNaN == NaN;   // false

幸運的是 JavaScript 提供了一個名為 isNaN 的方法,它接受一個唯一的參數,並返回該參數是否是保留值 NaN,下面的代碼已經幾乎成功地分辨了數字與非數字,唯一需要注意的是最後一行,Null 字元串也被返回 false,這表示 JavaScript 認為它是一個合法的數字,這是因為空白字串隱式轉型為數字0,這告訴我們,禁止Null 字元提交或驗證 length 屬性是非常有必要的。

isNaN(NaN);   // trueisNaN("5");   // falseisNaN("5a");   // trueisNaN("");    // false

而驗證 Infinity 則簡單多了,因為它既可以使用相等運算與全等運算,也可以使用 isFinite 檢測。isFinite 方法同樣只接受唯一的參數,用以檢測提供的數字是否是有限的。

1/0 == Infinity    // trueisFinite(1/0);    // false
4. 使用 "+" 運算子轉換字串為數字

在需要轉換為數位變數前面添上一個加號,這是目前最從容淡定的數實值型別轉型方法。

var a = "5";var b = 6;a + b;   // "56"+(a) + b;   // 11
5. 數字 0 的故事

JavaScript 太靈活了,以至於有的時候甚至分不清 0 到底還是不是0。事實上 0 既可以表示數字 0 ,也可以表示長度為0的字串,還可以表示布爾值 false,因此在需要明確區分它們的時候使用"==="全等符是非常正確的選擇。
大多數有經驗的前端程式員都提倡使用全等運算子,並儘可能地明確資料類型,這樣既可以規避諸如上面的一些錯誤,同時還將避免 JavaScript 內部處理時不必要的資料類型轉換過程,這樣做的好處在於它可以讓代碼運行得更快一點。

0 == false;  // true0 == ""  // true0 === false;  // false0 === ""  // false
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.