function initarr(n){ var arr = []; for(var i=0;i<n;i++){ arr[i] = parseFloat(prompt("第"+(i+1)+"個(gè)數(shù)")); } return arr; } function sumAndAvg(arr){ var sum = 0; var avg = 0; for(var i in arr){ sum = sum+arr[i]; } avg = sum/arr.length; document.write("sum = "+sum); document.write("avg = "+avg); }
一個(gè)簡(jiǎn)單的函數(shù),比如我在此刻定義一個(gè)
var a = 10;
sumAndAvg(a);
實(shí)際函數(shù)是想要一個(gè)數(shù)組的參數(shù)的,但是這種情況下怎么判斷穿進(jìn)去的參數(shù)是什么類型?
這樣的設(shè)計(jì)有什么優(yōu)點(diǎn)或者有什么缺點(diǎn)應(yīng)該怎么克服呢?
原生不檢查參數(shù)類型,這是由于js是弱數(shù)據(jù)類型的語言。一般情況下,js作為瀏覽器端的支持的時(shí)候,輸入?yún)?shù)類型是寫代碼的人預(yù)先就想好的了,所以一般不會(huì)出現(xiàn)這種問題。但是如果涉及用戶輸入或者交互產(chǎn)生數(shù)據(jù)的時(shí)候,就有可能會(huì)出現(xiàn)題主的情況。做法就是通過自定義方法判斷數(shù)據(jù)類型之后在進(jìn)行處理。下面是幾個(gè)類型判斷的方法,拋磚引玉:
js無法指定函數(shù)參數(shù)的類型,你如果想限制參數(shù)為array的話,就必須在函數(shù)內(nèi)部判斷 Array.isArray(arr)。
這里的參數(shù)arr后面冒號(hào)部分就是flow.js加的類型約束,這樣我們可以強(qiáng)制調(diào)用的時(shí)候使用數(shù)組。然后運(yùn)行flow做運(yùn)行檢查,就會(huì)提示類型不匹配
這個(gè)是動(dòng)態(tài)類型語言無約束帶來的問題,JS本身無法解決這個(gè)問題,你可以使用微軟出的TypeScript語言,它帶有類型系統(tǒng),編譯結(jié)果是JS。
這樣我們可以在開發(fā)時(shí)檢查類型,在生產(chǎn)環(huán)境下去除。
所以題主這樣就好了: