JS進(jìn)階系列01-JS的弱類型和動態(tài)類型

1. 弱類型,強類型寂祥,動態(tài)類型荐虐,靜態(tài)類型的區(qū)別

首先,我們要弄清楚編程語言的兩組劃分丸凭,即弱類型和強類型福扬,動態(tài)類型和靜態(tài)類型。下面有一幅圖惜犀,非常詳細(xì)地說明了它們各自的定義和區(qū)別铛碑。

動態(tài)/靜態(tài),強類型/弱類型-轉(zhuǎn)

該圖轉(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ā)實踐》 第一部分

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嵌巷,一起剝皮案震驚了整個濱河市萄凤,隨后出現(xiàn)的幾起案子室抽,更是在濱河造成了極大的恐慌,老刑警劉巖靡努,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪圾,死亡現(xiàn)場離奇詭異,居然都是意外死亡惑朦,警方通過查閱死者的電腦和手機兽泄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漾月,“玉大人病梢,你說我怎么就攤上這事×褐祝” “怎么了蜓陌?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吩蔑。 經(jīng)常有香客問我钮热,道長,這世上最難降的妖魔是什么烛芬? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任隧期,我火速辦了婚禮飒责,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仆潮。我一直安慰自己宏蛉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布性置。 她就那樣靜靜地躺著檐晕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚌讼。 梳的紋絲不亂的頭發(fā)上辟灰,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音篡石,去河邊找鬼芥喇。 笑死,一個胖子當(dāng)著我的面吹牛凰萨,可吹牛的內(nèi)容都是我干的继控。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胖眷,長吁一口氣:“原來是場噩夢啊……” “哼武通!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起珊搀,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冶忱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后境析,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囚枪,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年劳淆,在試婚紗的時候發(fā)現(xiàn)自己被綠了链沼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡沛鸵,死狀恐怖括勺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曲掰,我是刑警寧澤疾捍,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蜈缤,受9級特大地震影響拾氓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜底哥,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一咙鞍、第九天 我趴在偏房一處隱蔽的房頂上張望房官。 院中可真熱鬧,春花似錦续滋、人聲如沸翰守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜡峰。三九已至,卻和暖如春朗恳,著一層夾襖步出監(jiān)牢的瞬間湿颅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工粥诫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留油航,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓怀浆,卻偏偏與公主長得像谊囚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子执赡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容