話說上一篇介紹了JavaScript故事版的身世之謎。看官你估計也明白JavaScript出生之時,就未曾託於重任。布蘭登-艾奇估計也沒料到今天的JavaScript變得如此重要。要不然,當年他也不會如此惜墨,竟然只搞了一個"Var"宣告就海納百川。當然不是說如此惜墨有什麼重大缺陷,人家內部搞個型別推斷那也是牛B轟轟的。話說微軟那個c#也有個神奇的Var,有抄襲布蘭登-艾奇Idea的嫌疑!
布蘭登-艾奇如此惜墨,搞了個Var就算了,連我們們後端鞋同最熟悉的那些資料型別也省了。後端鞋同們一看這JavaScript,怎麼連宣告都簡單得只有一個Var,我們們那幫熟悉的老友"int、float、double、char、long......"也消失了。同學們難以接受,一開始就有點鄙視這看上去缺胳膊少腿的Javascript。於是乎,同學們都不屑一顧,頁面上的指令碼就寫得天馬行空了,反正不ERROR就行。
本樓一番廢話,不知道是否是道出了看官的心聲。是的,JavaScript的變數系統被布蘭登-艾奇這傢伙簡化了,專業上那叫“弱型別言語系統”。這玩兒是好是壞就不好定論了,當年本來就沒打算讓JavaScript幹啥大活兒,簡化設計也是時世所造。但是,鞋同們要想將JavaScript玩弄在手,那些if...else、do....while你可以鄙視,但是它的變數型別系統還是得要認真take a look!這也是本樓此番博文要一起共同學習的。
好!我們們的標題叫《JavaScript神一樣的變數系統》,我們們就看看怎麼個神法!
少而精的變數型別
鞋同們應該都有求職經歷,當年樓主就被這樣一個問題問倒了。“你說你js寫得還可以,那請問js裡面都有什麼資料型別?”。瞬間啞火,當然你可以說js那簡單的言語,不需要知道都有什麼資料型別,也可以寫得滿屏紛飛。但是細節決定成敗,樓主說不出,那offer可能也飛了。那javaScript到底有哪些資料型別,一句話:
數值型別只有一個(number),字串(string)少不了,真假(boolean)那也得留著,空值(null)加未定義(undefined)也是常用的,陣列(Array)那肯定也跑不了,還有一個上帝object,外加一個讓人頭痛的function。
是的,就是上面這句話,或許可以讓你拿到offer。但是上面這句話還得壓縮來說,啥意思呢?意思是上面的話是展開的,那為何不先說壓縮的,然後再說展開的呢?那是樓主我為了讓你記憶深刻一些了。準確來說,上面說的型別都是我們們編碼用到的具體型別,但是對於JavaScript的型別系統型別,真實的型別如下:
上帝Object包含了null、object(如var obj={.....})、array;number型別將所有一切數值型別的值都囊括其中;Boolean、String那幾乎是任何言語都不缺少的;function、undefined是JavaScript特有的;且看如下程式碼:
var myVar=null; console.log("myVar is "+myVar+" typeof="+typeof(myVar) );//結果:myVar is null typeof=object var myVar5={name:"k"}; console.log("myVar5 is "+myVar5+" typeof="+typeof(myVar5));//結果:myVar5 is [object Object] typeof=object var myVar6=[1,2,3,100]; console.log("myVar6 is "+myVar6+" typeof="+typeof(myVar6));//結果:myVar6 is 1,2,3,100 typeof=object var myVar1; console.log("myVar1 is "+myVar1+" typeof="+typeof(myVar1));//結果:myVar1 is undefined typeof=undefined var myVar2="kevin"; console.log("myVar2 is "+myVar2+" typeof="+typeof(myVar2));//結果:myVar2 is kevin typeof=string var myVar3=100.000000001; console.log("myVar3 is "+myVar3+" typeof="+typeof(myVar3));//結果:myVar3 is 100.000000001 typeof=number var myVar4=true; console.log("myVar4 is "+myVar4+" typeof="+typeof(myVar4));//結果:myVar4 is true typeof=boolean var myVar7=function(){} console.log("myVar7 is "+myVar7+" typeof="+typeof(myVar7));//myVar7 is function (){} typeof=function
看了上面的型別定義,你或許已經找到了規律,無非是將數值型別統一為number了,再加了兩個Javascript特有的function、undefined。是的,規律就是這樣的,記住這句話面試
就沒問題了。但是知道了具體的型別還不行,還得知道哪些是引用型別,哪些是值型別。這個也沒啥好說的,記住就行:object、function、array是引用型別,其他均為值型別!
神一樣的var宣告
說這個var像神一樣,是因為大部分情況下var定義的變數,你想它是啥就是啥;但絕非所有情況都是,比如"var res='123'+456;",你千萬別告訴我這是579!var除了你想啥就是啥的強大功能,它還有一個作用是用於JavaScript執行前的詞法解析,可以起到那個聽起來很高深的“變數提升”作用。由於涉及到JavaScript的詞法解析,故本博文先不作說明,敬請關注後面的詞法分析。
琢磨不透的作用域
作用域!作用域!作用域!難以捉摸的事情說三遍!這玩兒經常拿聽起來很牛逼的閉包來做列子。說到底,作用域也是跟Javascript的詞法解析密不可分。文章要是寫得太長,看著也困,同時也由於詞法解析的重要性,故本博文先不作說明,敬請關注後面的詞法分析。
看完這博文,你要是記住JavaScript的變數型別,那我們們的目的也達到了。