在介紹javascript型別系統之前,我們來解釋兩組區分不同程式語言時,提及的名詞分別為強型別和弱型別,靜態型別和動態型別,
分別從型別安全和型別檢查區分了強弱型別和靜動型別
一.通過型別安全區分 分為強型別和弱型別
強型別:語言層面限制了實參型別和形參型別必須相同,如果傳入其他型別的值會報錯,只有在傳入之前轉化為響應的型別,才可以
傳入如下圖所示:
弱型別:完全相反,弱型別語言層面不會限制實參的型別,即便是整型的數字,傳入字串型別語法上也是沒問題的,如下圖所示:
綜上所述:強型別不允許有任意的隱式型別轉換,而弱型別允許有任意的隱式型別轉換,比如javascript為弱型別語言,會把隱式轉
化為任意型別,呼叫的時候語法層面都不會報錯如下圖所示:
比如Python為強型別語言,則不會轉換型別,呼叫時候語言層面就會報錯如下圖所示:
2.通過型別檢查區分 動態型別和靜態型別
靜態型別:一個變數宣告時型別就是明確的 宣告過後,它的型別就不允許修改
動態型別:執行階段才能夠明確變數的型別 而且變數的型別隨時可以變化 如下圖所示:
動態型別語言中的變數沒有型別,變數中存放的值是有型別的.
二.JavaScript的型別特徵
javaScript是一門弱型別的動態型別的程式語言,javaScript是一門指令碼語言,沒有編譯環節,直接到執行環境執行,沒有型別檢查
1.JavaScript語言弱型別的問題
如下圖所示,obj是一個空物件,沒有foo方法,立即去執行,可以提示程式碼異常,但如果不是立即執行,則不會立即報錯,也就是說如果測試
沒有測到這行程式碼,則把隱患留在了程式碼當中,如果是強型別的語言,在這裡語法上就會報錯,而不用去執行這行程式碼
如下圖所示,sum裡面的引數,從程式碼中可以看出,期望的應該是兩個數字型別相加,如果說換成一個字串,一個數字,則會列印出兩個字元拼
接這是因為型別不確定導致的.如果是強型別語言,在語法上就行不通.
三.強型別語言的優勢(以javascript作反面條件)
1.錯誤更早暴露,在上文中已經多次提到,在此不再重複。
2.程式碼智慧提示,程式碼更準確,比如下圖所示,element型別不確定,編輯器的智慧提示也不知道要提示什麼
3.重構更牢靠 比如下圖中這段程式碼,這個util方法在多處使用,現在要把aaa方法換個名字,弱型別語言只有程式碼執行到那塊才會提示
而強型別語言會直接提示,有可能造成安全隱患,比如某個地方沒有修改。
4.減少不必要的型別判斷,如下圖所示保證a和b是number型別的話,只能加判斷條件,才能保證,強型別語言不用加型別判斷