話說上一篇介紹了JavaScript故事版的身世之謎。看官你估計也明白JavaScript出生之時,就不曾託於重任。布蘭登-艾奇估計也沒料到今天的JavaScript變得如此重要。要否則,當年他也不會如此惜墨,居然只搞了一個"Var"聲明就海納百川。固然不是說如此惜墨有什麼重大缺陷,人家內部搞個類型推斷那也是牛B轟轟的。話說微軟那個c#也有個神奇的Var,有抄襲布蘭登-艾奇Idea的嫌疑!javascript
布蘭登-艾奇如此惜墨,搞了個Var就算了,連我們後端鞋同最熟悉的那些數據類型也省了。後端鞋同們一看這JavaScript,怎麼連聲明都簡單得只有一個Var,我們那幫熟悉的老友"int、float、double、char、long......"也消失了。同窗們難以接受,一開始就有點鄙視這看上去缺胳膊少腿的Javascript。因而乎,同窗們都不屑一顧,頁面上的腳本就寫得天馬行空了,反正不ERROR就行。
java
本樓一番廢話,不知道是不是道出了看官的心聲。是的,JavaScript的變量系統被布蘭登-艾奇這傢伙簡化了,專業上那叫「弱類型言語系統」。這玩兒是好是壞就很差定論了,當年原本就沒打算讓JavaScript幹啥大活兒,簡化設計也是時世所造。可是,鞋同們要想將JavaScript玩弄在手,那些if...else、do....while你能夠鄙視,可是它的變量類型系統仍是得要認真take a look!這也是本樓此番博文要一塊兒共同窗習的。 面試
好!我們的標題叫《JavaScript神同樣的變量系統》,我們就看看怎麼個神法! c#
少而精的變量類型 後端
鞋同們應該都有求職經歷,當年樓主就被這樣一個問題問倒了。「你說你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。是的,規律就是這樣的,記住這句話面試spa
就沒問題了。可是知道了具體的類型還不行,還得知道哪些是引用類型,哪些是值類型。這個也沒啥好說的,記住就行:object、function、array是引用類型,其餘均爲值類型!
神同樣的var聲明
說這個var像神同樣,是由於大部分狀況下var定義的變量,你想它是啥就是啥;但絕非全部狀況都是,好比"var res='123'+456;",你千萬別告訴我這是579!var除了你想啥就是啥的強大功能,它還有一個做用是用於JavaScript運行前的詞法解析,能夠起到那個聽起來很高深的「變量提高」做用。因爲涉及到JavaScript的詞法解析,故本博文先不做說明,敬請關注後面的詞法分析。
琢磨不透的做用域
做用域!做用域!做用域!難以捉摸的事情說三遍!這玩兒常常拿聽起來很牛逼的閉包來作列子。說到底,做用域也是跟Javascript的詞法解析密不可分。文章要是寫得太長,看着也困,同時也因爲詞法解析的重要性,故本博文先不做說明,敬請關注後面的詞法分析。
看完這博文,你要是記住JavaScript的變量類型,那我們的目的也達到了。