剛寫完開篇,緊接著厚著臉皮開始寫這篇跌帐。
因為感覺如果一上來就是各種細(xì)節(jié)首懈,我自己都會受不了,所以先來個籠統(tǒng)的描述谨敛,說下 JavaScript 與 Java 的不同之處究履。當(dāng)然,是我個人的理解脸狸,基于個人并不淵博的知識和經(jīng)驗哈璃弄。
JavaScript 與 Java 最大的不同是:JavaScript 中沒有類(class)0!!
我曾經(jīng)自學(xué)過 Java下硕,第一個 HelloWorld 程序就要寫在類里面,再整個 main 方法(貌似是吧)寺庄。然而俐巴,對于 JavaScript,如果你想也來個 HelloWorld 的話牵囤,可以這樣:
alert("Hello, world!")
當(dāng)然爸黄,因為要在一個環(huán)境里面執(zhí)行嘛滞伟,所以可以打開記事本,寫個 HTML 頁面炕贵,把這個放到一個 <script> 標(biāo)簽中梆奈,然后再用瀏覽器打開這個本地 HTML 文檔,然后....好吧称开,的確繁瑣亩钟。
好吧,我來說個稍微簡單的方法鳖轰,請打開一個現(xiàn)代瀏覽器清酥。哦,對吼蕴侣,你現(xiàn)在就應(yīng)該是開著一個瀏覽器焰轻,不過是否“現(xiàn)代”呢就不好說。通常昆雀,在前端領(lǐng)域辱志,經(jīng)常會吐槽 IE 瀏覽器(嗯,就是 Windows 操作系統(tǒng)自帶的那個瀏覽器)狞膘,由于版本更新時間較長揩懒,所以 bug 修復(fù)比其他瀏覽器慢,而且很多時候(主要是指老版本)自成體系挽封,與其他瀏覽器陣營區(qū)別較大旭从,以及等等原因,反正就是不被一些人喜愛场仲『驮茫可又因為使用人群太廣泛,特別是在中國渠缕,所以被吐槽得較多鸽素。哎,我本來不是在講 Helloworld 的嗎亦鳞?回正題馍忽。
以我現(xiàn)在在用的 Firefox 來說,可以通過 Ctrl + Shift + K 來打開瀏覽器的控制臺燕差,然后你可以把上面的那個 JavaScript 代碼復(fù)制到輸入框里遭笋,然后回車執(zhí)行。據(jù)我所知徒探,Chrome 可以通過 F12 打開控制臺瓦呼,IE 也是 F12,不過低版本貌似不支持輸入腳本執(zhí)行好像测暗。反正你有興趣就自己試試吧央串。
喜歡折騰的朋友磨澡,可以裝個 NodeJS(其實真心不麻煩的,從搜索開始吧)质和,然后在 NodeJS 環(huán)境里也可以輸入上面的代碼執(zhí)行的稳摄。哦,不對饲宿!我錯了厦酬,NodeJS 下面會報錯的!L毕搿仗阅!因為啥,因為 JavaScript 語言實際上就根本沒有提供對輸入輸入的支持5钔小E铡剧蚣!而那個 alert() 函數(shù)(叫方法也行)實際上是瀏覽器的運行環(huán)境下通常提供的一個函數(shù)支竹。那么怎么在 NodeJS 下輸出 “Hello, world!” 呢,好吧鸠按,你直接輸入帶引號的 "Hello, world!"(這里我特意把引號換成了半角的礼搁,嚴(yán)謹(jǐn),有木有)然后回車就好了....
咦目尖,不是要說“類”的事的嘛馒吴,對吼。
JavaScript 也是面向?qū)ο蟮纳前∫粒F(xiàn)在誰要不是面向?qū)ο蟮亩疾缓靡馑汲鲩T。但是 JavaScript 并沒有提供類(盡管 JavaScript 中 class 是個暫時沒有使用的關(guān)鍵字洞拨,而且下個版本的 JavaScript 中很可能就會用上這個關(guān)鍵字啦扯罐,但那是以后。PS:我為啥總是這么嚴(yán)謹(jǐn)烦衣,備注有些多啊歹河。唉,處女座....)花吟,也沒有那么正統(tǒng)的一套基于類的繼承機(jī)制秸歧,以及什么 static, public, protected, private 等等這些東東(盡管其中好多也是沒有用到的關(guān)鍵字,也就是說不能拿來作為變量名)衅澈。所以键菱,僅這一點就讓 Java 程序員大跌眼鏡了吧!你肯定想說今布,就這也敢說是面向?qū)ο笊闯埽堪盘荩〔贿^,因為你已經(jīng)寫過 JavaScript 代碼了弄喘,你更可能會說玖喘,啊,JavaScript 還面向?qū)ο竽⒅荆浚?/p>
是的累奈,學(xué)術(shù)上講(咳咳),JavaScript 是面向“原型”(prototype)的急但,可以認(rèn)為是另一支面向?qū)ο蟮木幊陶Z言家族吧澎媒。原型,簡單來說波桩,就是一個對象是另一個對象的原型戒努,于是后面的對象就可以繼承原型對象的屬性、方法啦镐躲。呵呵储玫,其實挺簡單。不過萤皂,如果要是刻意模仿 Java 中的模式撒穷,在 JavaScript 中定義可復(fù)用的“類”,再實現(xiàn)繼承之類的東東裆熙,就會搞得很累端礼,很累。所以入录,倒不如一開始就接受 JavaScript 是和 Java 不同的蛤奥,沒有類,但也能實現(xiàn)面向?qū)ο蟮奶匦浴?/p>
再次強(qiáng)調(diào)僚稿,盡管在 JavaScript 中有這樣的寫法凡桥,例如:
var now = new Date();
now.getFullYear(); // 得到當(dāng)前年份 2014
實際上,Date 不是一個類哦贫奠。認(rèn)真點跟你說的話唬血,它是個“函數(shù)”(Function)。
在設(shè)計 JavaScript 的時候唤崭,那個家伙故意搞了這種類似創(chuàng)建類的實例的語法拷恨,但實際上理解起來很繞。這里我就不再說這個梗(geng谢肾,還有拼音腕侄,多貼心)啦,應(yīng)該會再寫文章詳細(xì)講的。
盡管不是嚴(yán)格意義上的(你問我為什么不是嚴(yán)格意義上的冕杠,我也就是說說微姊,好商量嘛)函數(shù)式編程語言,但 JavaScript 中的確是有很多函數(shù)式編程語言的特性分预,例如函數(shù)是第一性的兢交。其實上一句話有點學(xué)術(shù)啦,我忘了從哪里看的了笼痹∨湓總之,“函數(shù)”在 JavaScript 里面非常非常重要就是了凳干,甚至可以說理解了 JavaScript 里的函數(shù)晴裹,也就理解了 JavaScript 眾多千奇百怪的東東的核心啦。
因為是拿 JavaScript 和 Java 進(jìn)行比較救赐,所以我覺得最大的不同在于 JavaScript 中沒有類涧团,因為貌似類是 Java 中很重要的一個東西(說得偏差太大請參考第一篇的“免責(zé)說明”_)。但如果只是講 JavaScript 本身经磅,拋開你有 Java 背景這件事泌绣,我認(rèn)為函數(shù)的確是 JavaScript 最重要,最需要搞清楚的東西馋贤。
把類和函數(shù)放在一起赞别,JavaScript 給出了一種用函數(shù)來模擬類的定義的方式畏陕,例如:
function Person(name) {
this.name = name;
this.toString = function () { return this.name; }
}
var me = new Person("luobo");
me.toString(); // "luobo"
以上代碼配乓,你現(xiàn)在就可以復(fù)制到“現(xiàn)代”瀏覽器的控制臺執(zhí)行(或者輸入到 NodeJS 控制臺執(zhí)行)。
我真的不想現(xiàn)在就來仔細(xì)說明上面這段代碼中 Person 函數(shù)是怎么回事惠毁,因為這一段代碼涉及很多:函數(shù)犹芹、原型、構(gòu)造函數(shù)鞠绰,一兩句話說不清腰埂,就像我曾經(jīng)花一兩個小時思考也不會立馬搞清楚一樣(呃,現(xiàn)在算是有些明白了蜈膨,所以才敢拿出來“現(xiàn)”坝炝)。不過翁巍,要記住驴一,上面沒有“類”,只有函數(shù)灶壶。
吼吼肝断,寫了這么多,打住。以上就是我理解的 JavaScript 與 Java 的最大的不同胸懈,諸如語法担扑、語言特性等各種細(xì)節(jié),慢慢再來說嘍趣钱。
PS:感覺我寫東西口氣挺輕松吼涌献,其實我是個嚴(yán)肅的人-_-。