從類型安全角度來比較,可以分為以下:
強(qiáng)類型與弱類型
強(qiáng)類型:語(yǔ)言層面限制函數(shù)的實(shí)參類型必須與形參類型相同
弱類型:語(yǔ)言層面不會(huì)限制實(shí)參的類型
javascript中允許隱式轉(zhuǎn)換
>'100' - 50
50
>Math.floor(true)
1
從類型檢查角度來比較,可以分為以下:
靜態(tài)類型與動(dòng)態(tài)類型
靜態(tài)類型:一個(gè)變量聲明時(shí),類型就是明確的,并且聲明過后、類型不允許再修改
動(dòng)態(tài)類型:在運(yùn)行階段,才能明確變量的類型,在運(yùn)行過程中類型也會(huì)發(fā)生變化
JavaScript類型系統(tǒng)特征
Javascript是弱類型 且 動(dòng)態(tài)類型,缺失了類型系統(tǒng)的可靠性
以前應(yīng)用比較小,JavaScript也沒有編譯環(huán)節(jié),所以它成為一個(gè)弱類型/動(dòng)態(tài)類型的語(yǔ)言,這也并沒有什么問題。設(shè)置可以說,這也是javascript的一種優(yōu)勢(shì)。
但是現(xiàn)在和以前完全不同了,都是一些非常復(fù)雜的應(yīng)用,開發(fā)周期也越來越長(zhǎng)。在這種情況下,之前JavaScript的優(yōu)勢(shì)(弱類型、動(dòng)態(tài)類型)就變成了短板。
弱類型產(chǎn)生的問題:
// 在語(yǔ)法層面這樣寫沒有問題
// 必須等到運(yùn)行的時(shí)候才發(fā)現(xiàn)問題
const obj = {}
obj.foo()
// 假如這行代碼不是立即執(zhí)行,而是過一段時(shí)間,獲取在其他的方法中。
// 測(cè)試如果沒有執(zhí)行到這個(gè)方法就不會(huì)報(bào)錯(cuò)
// 這樣就留下了隱患
setTimeout(() => {
obj.for()
}, 10000000)
------------------------------------------------------------------------
// 參數(shù)類型不明確,函數(shù)功能發(fā)生變化
function sum(a, b) {
return a + b
}
console.log(sum(100, 100))
// => 200
console.log(sum(100, '100'))
// => 100100
------------------------------------------------------------------------
// 對(duì)對(duì)象錯(cuò)誤用法
const obj = {}
obj[true] = 100
// 對(duì)象內(nèi)部會(huì)將屬性名轉(zhuǎn)換為字符串
console.log(obj['true'])
// => 100
強(qiáng)類型的優(yōu)勢(shì)
1.錯(cuò)誤更早暴露,可以在編碼階段提前暴露異常
2.代碼更智能,編碼更準(zhǔn)確。(編輯器時(shí)時(shí)刻刻都知道變量是什么類型)
3.重構(gòu)更牢靠
4.減少不必要的類型判斷(在javasript中,我們需要用代碼去做一些類型判斷)