1. 弱類型,強類型寂祥,動態(tài)類型荐虐,靜態(tài)類型的區(qū)別
首先,我們要弄清楚編程語言的兩組劃分丸凭,即弱類型和強類型福扬,動態(tài)類型和靜態(tài)類型。下面有一幅圖惜犀,非常詳細(xì)地說明了它們各自的定義和區(qū)別铛碑。
該圖轉(zhuǎn)自編程語言傻傻分不清:弱類型虽界、強類型汽烦、動態(tài)類型、靜態(tài)類型一文莉御,大家可以前往該文章查看編程語言這兩組劃分的詳細(xì)定義和區(qū)別撇吞。
2. JS的弱類型和動態(tài)類型
JS種有5種基本數(shù)據(jù)類型:Undefined,Null礁叔,Boolean牍颈,Number和String,以及一種復(fù)雜數(shù)據(jù)類型Object琅关。但JS的變量在聲明時無需指定其類型颂砸,而是統(tǒng)一使用var
關(guān)鍵字。并且在其聲明之后,我們可以為其隨便賦值不同的類型人乓。
JS由于不需要關(guān)注變量的類型勤篮,可以使代碼更加簡潔,也能使開發(fā)者集中更多的精力在處理業(yè)務(wù)邏輯之上色罚。但由于其無法保證變量類型碰缔,從而在程序運行期可能發(fā)生跟類型相關(guān)的錯誤。 比如:
var s = 1;
s(); //Uncaught TypeError: s is not a function
而這樣的錯誤對于JAVA在編譯期間就會檢查出來戳护。
3. JS鴨子類型的思想
(這一節(jié)的內(nèi)容大家可以直接看BOOK-《JavaScript設(shè)計模式與開發(fā)實踐》 第一部分)
JS對變量類型的寬容給實際編碼帶來了很大的靈活性金抡,由于無需進(jìn)行類型檢測,開發(fā)者可以嘗試調(diào)用任意對象的任意方法腌且,而無須去考慮它原本是否被設(shè)計為擁有該方法梗肝。
這一切都建立在鴨子類型(duck typing)
的概念上。鴨子類型的通俗說法是:“如果它走起路來像鴨子铺董,叫起來也是鴨子巫击,那么它就是鴨子【”
有個很形象的例子:
從前在Javascript王國里坝锰,有一個國王,他覺得世界上最美妙的聲音就是鴨子的叫聲重付,于是國王召集大臣顷级,要組建一個1000只鴨子組成的合唱團(tuán)。大臣們找遍了全國終于找到999只鴨子确垫,但是始終還差一只弓颈,最后大臣發(fā)現(xiàn)一直特別的雞,它的叫聲跟鴨子一模一樣删掀,于是這只雞就成為了合唱團(tuán)的最后一員翔冀。
這個故事告訴我們,國王要聽的只是鴨子的叫聲爬迟,這個聲音的主人到底是一個雞還是要鴨子并不重要橘蜜。鴨子類型指導(dǎo)我們只關(guān)注對象的行為,而不關(guān)注對象本身付呕,也就是關(guān)注HAS-A(擁有什么)计福,而不是IS-A(是什么)。
下面我們用代碼模擬這個故事:
var duck={
duckSinging:function(){
console.log("噶嘎嘎");
}
};
var chicken={
duckSinging: function () {
console.log("噶嘎嘎");
}
};
var choir=[]; //合唱團(tuán)
var joinChoir=function(animal){
if(animal&&typeof animal.duckSinging==='function'){
choir.push(animal);
console.log("恭喜加入合唱團(tuán)");
console.log("合唱團(tuán)已有成員:"+choir.length);
}
};
joinChoir(duck);
joinChoir(chicken);
我們看到徽职,對于加入合唱團(tuán)的動物象颖,大臣們根本無需檢查它們的類型,而是只需要保證它們擁有duckSinging方法姆钉。如果下次期望加入合唱團(tuán)的是一只小狗说订,而這只小狗剛好也會鴨子叫抄瓦,我相信這只小狗也能順利加入。
在動態(tài)類型語言的面向?qū)ο笤O(shè)計中陶冷。鴨子類型的概念至關(guān)重要钙姊。利用鴨子類型的思想,我們不必借助超類型的幫助埂伦,就能輕松地在動態(tài)類型語言中實現(xiàn)一個原則:“面向接口編程煞额,而不是面向?qū)崿F(xiàn)編程”。例如沾谜,一個對象若有push和pop方法膊毁,并且這些方法提供了正確的實現(xiàn),它就可以被用來當(dāng)作棧使用基跑。一個對象如果有了length屬性婚温,也可以依照下標(biāo)來存取屬性(最好還要擁有slice和splice等方法),這個對象就可以被當(dāng)做數(shù)組來使用媳否。
參考
編程語言傻傻分不清:弱類型栅螟、強類型、動態(tài)類型逆日、靜態(tài)類型
BOOK-《JavaScript設(shè)計模式與開發(fā)實踐》 第一部分