Bug caused by duck typing

之前寫Javascript,無意中發現左一個唔小心用左duck typing 而做成嘅bug。

Context

有一個function,take一個array,之後check個array有冇某一個element

1
2
3
const hasApple = (myFridge) => {
return myFridge.includes("apple");
}

個function好straight forward,hasApple(['orange']) return false, 而hasApple(['apple']) return true。

但由於Javascript係冇type checking,programmer可以pass唔係array嘅野入去。如果佢咁岩pass一個string咁岩有”apple”係sub string就瀨野。因為String都有includes() E個function,如果string入面有特定嘅sub string就會return true。

所以hasApple('pineapple')就會瀨左野,無端端return true。

Solution

其實個solution好簡單,check一check pass入黎係咪array就得

1
2
3
const hasApple = (myFridge) => {
return isArray(myFridge) && myFridge.includes("apple");
}

個難度係喺出事前就identify到個bug,除非真係熟曬D javascript built in functions。E個算係dynamic typing with duck typing langauge嘅弱點。