JavaScript是一門弱類型語言,這也意味著在函數(shù)中,參數(shù)類型并不是一定需要預(yù)定義。不過,這也帶來了一個問題:使用不同的參數(shù)類型可能會產(chǎn)生意想不到的結(jié)果。因此,在設(shè)計JavaScript函數(shù)時,隨時牢記參數(shù)類型的問題就顯得尤為重要。
舉個簡單的例子,如果你想設(shè)計一個函數(shù),該函數(shù)的作用是將兩個數(shù)字相加并返回結(jié)果。就像這樣:
function add(a, b){ return a + b; }
這個函數(shù)的參數(shù)類型就是數(shù)字類型,當(dāng)然,如果你將一個數(shù)字類型和一個非數(shù)字類型一起傳入這個函數(shù)中,結(jié)果可能并非你想象中的那樣:
add(2, '3'); // returns "23"
很明顯,這個函數(shù)返回的是字符串類型,而非數(shù)字類型的結(jié)果。這是因為加號(`+`)不僅僅可以將兩個數(shù)字相加,還能將其他類型的值進(jìn)行拼接。如果要避免這種情況發(fā)生,我們需要添加一些檢查參數(shù)類型的語句:
function add(a, b){ if(typeof a === 'number' && typeof b === 'number'){ return a + b; } else{ return NaN; } }
好了,現(xiàn)在這個函數(shù)只能用來處理數(shù)字類型的參數(shù)了。如果你想讓它支持其他類型的參數(shù),可以改寫為這樣:
function add(a, b){ if(typeof a !== 'number' || typeof b !== 'number'){ return NaN; } else{ return a + b; } }
這樣一來,只要其中一個參數(shù)不是數(shù)字類型,這個函數(shù)就會返回`NaN`。
除了使用`typeof`檢查參數(shù)類型之外,還有其他的方法。例如,你可以使用一個函數(shù)來檢查值是否為數(shù)字類型:
function isNumeric(value){ return !isNaN(parseFloat(value)) && isFinite(value); } function add(a, b){ if(isNumeric(a) && isNumeric(b)){ return a + b; } else{ return NaN; } }
這個版本的`add`函數(shù)還有一個新的問題:如果傳入的參數(shù)是字符串類型,可能會將它們解析為數(shù)字類型。例如:
add('2', '3'); // returns 5
為了避免這種情況,可以加上一些嚴(yán)格模式的檢查:
function isNumeric(value){ return typeof value === 'number' || (typeof value === 'string' && !isNaN(value)); } function add(a, b){ if(isNumeric(a) && isNumeric(b)){ return Number(a) + Number(b); } else{ return NaN; } }
現(xiàn)在,所有的非數(shù)字類型都會被正確地解析為`NaN`。
關(guān)于函數(shù)參數(shù)類型的問題不僅僅出現(xiàn)在數(shù)字類型上,還可能出現(xiàn)在其他類型中。例如,如果你的函數(shù)需要一個數(shù)組作為參數(shù):
function sumArray(arr){ var sum = 0; for(var i = 0; i< arr.length; i++){ if(typeof arr[i] !== 'number'){ return NaN; } sum += arr[i]; } return sum; }
這個函數(shù)會遍歷數(shù)組中的每個元素,并且檢查它是否為數(shù)字類型。如果不是,函數(shù)就返回`NaN`。以下是使用該函數(shù)的示例:
sumArray([1, 2, 3]); // returns 6 sumArray([1, '2', 3]); // returns NaN
另一個常見的問題是函數(shù)參數(shù)缺失。如果你預(yù)期函數(shù)將始終接收到一個特定數(shù)目的參數(shù),并且其中一個或多個參數(shù)缺失,那么你就需要添加一些檢查語句:
function greet(name){ if(arguments.length< 1){ return 'Hello, world!'; } else{ return 'Hello, ' + name; } }
這個函數(shù)可以采取兩種方式之一來使用。如果沒有參數(shù)傳入,它將返回`Hello, world!`。如果有參數(shù)傳入,它將返回`Hello, $name`。
總之,當(dāng)你設(shè)計JavaScript函數(shù)時,參數(shù)類型是一個需要考慮的問題。確保你的函數(shù)只接受合法的參數(shù)類型并正確處理它們,這將有助于減少出現(xiàn)意料之外的情況的可能性。