今天在一個(gè)小地方卡了許久, 在多方嘗試之下才注意到可能是傳入函式的第一個(gè)引述預(yù)設(shè)必須是Array, 而我卻丟了一下Object給它, 導(dǎo)致該函式內(nèi)部實(shí)作沒(méi)有問(wèn)題, 但結(jié)果卻不符合預(yù)期, 從這件事情讓我對(duì)引述檢查有更深的體會(huì), 在js這種語(yǔ)言中尤其重要, 因?yàn)锳rray屬性的讀取方式在Object底下也是以使用的, 以下舉個(gè)例子
// 範(fàn)例函式 f
function f(arr) {
arr[1] = 'test string'
}
// 定義物件 obj
let obj = { x: 'hello', y: 'Cian'}
// 物件obj 索引1 = 255
obj[1] = 255
let arr = ['a', 'b', 'c']
f(obj) // 不小心傳了物件給函式 f
console.log(obj)
console.log(arr)
// 如此一來(lái)我們並未發(fā)生程式錯(cuò)誤, 但卻改錯(cuò)了對(duì)象
// 因此我們可以嘗試在函式中加入型別檢查
// 範(fàn)例函式
function example1(arr) {
console.log(typeof arr)
}
example1(obj) // object
example1(arr) // object
// 以上輸出結(jié)果可以發(fā)現(xiàn)由於js屬於物件繼承, typeof array 會(huì)得到 object
// 於此, 我們必須換個(gè)方式檢查
// 修改範(fàn)例函式
function example2(arr) {
console.log(arr instanceof Array)
}
example2(obj) // false
example2(arr) // true
// 使用instanceof可以正確的區(qū)別物件及陣列, 是較好的方法
由於JavaScript的便利性常常會(huì)因?yàn)橐粋€(gè)不小心而倒是結(jié)果錯(cuò)誤, 不管是這次的傳錯(cuò)物件/陣列, 或是數(shù)字與字串的處理, 都很容易發(fā)生預(yù)期外的事情發(fā)生, 因此較好的做法是養(yǎng)成參數(shù)檢查的習(xí)慣梳玫。