淺談程式語言型別的強型別,弱型別,動態型別,靜態型別

メSerendipity發表於2021-01-10

在介紹javascript型別系統之前,我們來解釋兩組區分不同程式語言時,提及的名詞分別為強型別弱型別,靜態型別動態型別

分別從型別安全和型別檢查區分了強弱型別靜動型別

 

一.通過型別安全區分 分為強型別和弱型別

強型別:語言層面限制了實參型別和形參型別必須相同,如果傳入其他型別的值會報錯,只有在傳入之前轉化為響應的型別,才可以

傳入如下圖所示:

 

弱型別:完全相反,弱型別語言層面不會限制實參的型別,即便是整型的數字,傳入字串型別語法上也是沒問題的,如下圖所示:

綜上所述:強型別不允許有任意的隱式型別轉換,而弱型別允許有任意的隱式型別轉換,比如javascript為弱型別語言,會把隱式轉

化為任意型別,呼叫的時候語法層面都不會報錯如下圖所示:

比如Python為強型別語言,則不會轉換型別,呼叫時候語言層面就會報錯如下圖所示:

2.通過型別檢查區分 動態型別和靜態型別

靜態型別:一個變數宣告時型別就是明確的 宣告過後,它的型別就不允許修改

動態型別:執行階段才能夠明確變數的型別 而且變數的型別隨時可以變化 如下圖所示:

動態型別語言中的變數沒有型別,變數中存放的值是有型別的.

二.JavaScript的型別特徵

javaScript是一門弱型別的動態型別的程式語言,javaScript是一門指令碼語言,沒有編譯環節,直接到執行環境執行,沒有型別檢查

1.JavaScript語言弱型別的問題

如下圖所示,obj是一個空物件,沒有foo方法,立即去執行,可以提示程式碼異常,但如果不是立即執行,則不會立即報錯,也就是說如果測試
沒有測到這行程式碼,則把隱患留在了程式碼當中,如果是強型別的語言,在這裡語法上就會報錯,而不用去執行這行程式碼

如下圖所示,sum裡面的引數,從程式碼中可以看出,期望的應該是兩個數字型別相加,如果說換成一個字串,一個數字,則會列印出兩個字元拼
接這是因為型別不確定導致的.如果是強型別語言,在語法上就行不通.

三.強型別語言的優勢(以javascript作反面條件)

1.錯誤更早暴露,在上文中已經多次提到,在此不再重複。

2.程式碼智慧提示,程式碼更準確,比如下圖所示,element型別不確定,編輯器的智慧提示也不知道要提示什麼

3.重構更牢靠 比如下圖中這段程式碼,這個util方法在多處使用,現在要把aaa方法換個名字,弱型別語言只有程式碼執行到那塊才會提示

而強型別語言會直接提示,有可能造成安全隱患,比如某個地方沒有修改。

 

4.減少不必要的型別判斷,如下圖所示保證a和b是number型別的話,只能加判斷條件,才能保證,強型別語言不用加型別判斷

相關文章