Java 和 JavaScript 的區(qū)別

很多人看到 Java 和 JavaScript 都有“Java”四個(gè)字,就以為它們是同一樣?xùn)|西,連我自己當(dāng)初也是這樣。

其實(shí)它們是完完全全不同的兩種東西。

Java,全稱應(yīng)該是 Java Applet,是嵌在網(wǎng)頁中,而又有自己獨(dú)立的運(yùn)行窗口的小程序。

Java Applet 是預(yù)先編譯好的,一個(gè)Applet 文件(.class)用 Notepad 打開閱讀,根本不能理解。Java Applet 的功能很強(qiáng)大,可以訪問 http、ftp等協(xié)議,甚至可以在電腦上種病毒(已有先例了)。

相比之下,JavaScript 的能力就比較小了。JavaScript 是一種“腳本”(“Script”),它直接把代碼寫到 HTML文檔中,瀏覽器讀取它們的時(shí)候才進(jìn)行編譯、執(zhí)行,所以能查看 HTML 源文件就能查看JavaScript 源代碼。JavaScript 沒有獨(dú)立的運(yùn)行窗口,瀏覽器當(dāng)前窗口就是它的運(yùn)行窗口。

它們的相同點(diǎn),我想只有同是以 Java 作編程語言一點(diǎn)了。




因?yàn)楦杏X如果一上來就是各種細(xì)節(jié),我自己都會(huì)受不了,所以先來個(gè)籠統(tǒng)的描述,說下 JavaScript 與 Java 的不同之處。當(dāng)然,是我個(gè)人的理解,基于個(gè)人并不淵博的知識(shí)和經(jīng)驗(yàn)哈。

當(dāng)然,因?yàn)橐谝粋€(gè)環(huán)境里面執(zhí)行嘛,所以可以打開記事本,寫個(gè) HTML 頁面,把這個(gè)放到一個(gè) 標(biāo)簽中,然后再用瀏覽器打開這個(gè)本地 HTML 文檔,然后....好吧,的確繁瑣。

好吧,我來說個(gè)稍微簡(jiǎn)單的方法,請(qǐng)打開一個(gè)現(xiàn)代瀏覽器。哦,對(duì)吼,你現(xiàn)在就應(yīng)該是開著一個(gè)瀏覽器,不過是否“現(xiàn)代”呢就不好說。通常,在前端領(lǐng)域,經(jīng)常會(huì)吐槽 IE 瀏覽器(嗯,就是 Windows 操作系統(tǒng)自帶的那個(gè)瀏覽器),由于版本更新時(shí)間較長(zhǎng),所以 bug 修復(fù)比其他瀏覽器慢,而且很多時(shí)候(主要是指老版本)自成體系,與其他瀏覽器陣營區(qū)別較大,以及等等原因,反正就是不被一些人喜愛??捎忠?yàn)槭褂萌巳禾珡V泛,特別是在中國,所以被吐槽得較多。哎,我本來不是在講 Helloworld 的嗎?回正題。

以我現(xiàn)在在用的 Firefox 來說,可以通過 Ctrl + Shift + K 來打開瀏覽器的控制臺(tái),然后你可以把上面的那個(gè) JavaScript 代碼復(fù)制到輸入框里,然后回車執(zhí)行。據(jù)我所知,Chrome 可以通過 F12 打開控制臺(tái),IE 也是 F12,不過低版本貌似不支持輸入腳本執(zhí)行好像。反正你有興趣就自己試試吧。

喜歡折騰的朋友,可以裝個(gè) NodeJS(其實(shí)真心不麻煩的,從搜索開始吧),然后在 NodeJS 環(huán)境里也可以輸入上面的代碼執(zhí)行的。哦,不對(duì)!我錯(cuò)了,NodeJS 下面會(huì)報(bào)錯(cuò)的?。?!因?yàn)樯?,因?yàn)?JavaScript 語言實(shí)際上就根本沒有提供對(duì)輸入輸入的支持?。?!而那個(gè) alert() 函數(shù)(叫方法也行)實(shí)際上是瀏覽器的運(yùn)行環(huán)境下通常提供的一個(gè)函數(shù)。那么怎么在 NodeJS 下輸出 “Hello, world!” 呢,好吧,你直接輸入帶引號(hào)的 "Hello, world!"(這里我特意把引號(hào)換成了半角的,嚴(yán)謹(jǐn),有木有)然后回車就好了....

咦,不是要說“類”的事的嘛,對(duì)吼。

JavaScript 也是面向?qū)ο蟮?,是啊,現(xiàn)在誰要不是面向?qū)ο蟮亩疾缓靡馑汲鲩T。但是 JavaScript 并沒有提供類(盡管 JavaScript 中 class 是個(gè)暫時(shí)沒有使用的關(guān)鍵字,而且下個(gè)版本的 JavaScript 中很可能就會(huì)用上這個(gè)關(guān)鍵字啦,但那是以后。PS:我為啥總是這么嚴(yán)謹(jǐn),備注有些多啊。唉,處女座....),也沒有那么正統(tǒng)的一套基于類的繼承機(jī)制,以及什么 static, public, protected, private 等等這些東東(盡管其中好多也是沒有用到的關(guān)鍵字,也就是說不能拿來作為變量名)。所以,僅這一點(diǎn)就讓 Java 程序員大跌眼鏡了吧!你肯定想說,就這也敢說是面向?qū)ο??!不過,因?yàn)槟阋呀?jīng)寫過 JavaScript 代碼了,你更可能會(huì)說,啊,JavaScript 還面向?qū)ο???/p>

是的,學(xué)術(shù)上講(咳咳),JavaScript 是面向“原型”(prototype)的,可以認(rèn)為是另一支面向?qū)ο蟮木幊陶Z言家族吧。原型,簡(jiǎn)單來說,就是一個(gè)對(duì)象是另一個(gè)對(duì)象的原型,于是后面的對(duì)象就可以繼承原型對(duì)象的屬性、方法啦。呵呵,其實(shí)挺簡(jiǎn)單。不過,如果要是刻意模仿 Java 中的模式,在 JavaScript 中定義可復(fù)用的“類”,再實(shí)現(xiàn)繼承之類的東東,就會(huì)搞得很累,很累。所以,倒不如一開始就接受 JavaScript 是和 Java 不同的,沒有類,但也能實(shí)現(xiàn)面向?qū)ο蟮奶匦浴?/p>

再次強(qiáng)調(diào),盡管在 JavaScript 中有這樣的寫法,例如:

varnow =newDate();now.getFullYear();// 得到當(dāng)前年份 2014

實(shí)際上,Date 不是一個(gè)類哦。認(rèn)真點(diǎn)跟你說的話,它是個(gè)“函數(shù)”(Function)。

在設(shè)計(jì) JavaScript 的時(shí)候,那個(gè)家伙故意搞了這種類似創(chuàng)建類的實(shí)例的語法,但實(shí)際上理解起來很繞。這里我就不再說這個(gè)梗(geng,還有拼音,多貼心)啦,應(yīng)該會(huì)再寫文章詳細(xì)講的。

盡管不是嚴(yán)格意義上的(你問我為什么不是嚴(yán)格意義上的,我也就是說說,好商量嘛)函數(shù)式編程語言,但 JavaScript 中的確是有很多函數(shù)式編程語言的特性,例如函數(shù)是第一性的。其實(shí)上一句話有點(diǎn)學(xué)術(shù)啦,我忘了從哪里看的了??傊?,“函數(shù)”在 JavaScript 里面非常非常重要就是了,甚至可以說理解了 JavaScript 里的函數(shù),也就理解了 JavaScript 眾多千奇百怪的東東的核心啦。

因?yàn)槭悄?JavaScript 和 Java 進(jìn)行比較,所以我覺得最大的不同在于 JavaScript 中沒有類,因?yàn)槊菜祁愂?Java 中很重要的一個(gè)東西(說得偏差太大請(qǐng)參考第一篇的“免責(zé)說明”^_^)。但如果只是講 JavaScript 本身,拋開你有 Java 背景這件事,我認(rèn)為函數(shù)的確是 JavaScript 最重要,最需要搞清楚的東西。

把類和函數(shù)放在一起,JavaScript 給出了一種用函數(shù)來模擬類的定義的方式,例如:

functionPerson(name){this.name = name;this.toString =function(){returnthis.name; }}varme =newPerson("luobo");me.toString();// "luobo"

以上代碼,你現(xiàn)在就可以復(fù)制到“現(xiàn)代”瀏覽器的控制臺(tái)執(zhí)行(或者輸入到 NodeJS 控制臺(tái)執(zhí)行)。

我真的不想現(xiàn)在就來仔細(xì)說明上面這段代碼中 Person 函數(shù)是怎么回事,因?yàn)檫@一段代碼涉及很多:函數(shù)、原型、構(gòu)造函數(shù),一兩句話說不清,就像我曾經(jīng)花一兩個(gè)小時(shí)思考也不會(huì)立馬搞清楚一樣(呃,現(xiàn)在算是有些明白了,所以才敢拿出來“現(xiàn)”?。?。不過,要記住,上面沒有“類”,只有函數(shù)。

吼吼,寫了這么多,打住。以上就是我理解的 JavaScript 與 Java 的最大的不同,諸如語法、語言特性等各種細(xì)節(jié),慢慢再來說嘍。

PS:感覺我寫東西口氣挺輕松吼,其實(shí)我是個(gè)嚴(yán)肅的人-_-。

文/luobo_tang(簡(jiǎn)書作者)

原文鏈接:http://m.itdecent.cn/p/8488d306bae9

著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),并標(biāo)注“簡(jiǎn)書作者”。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java是一個(gè)支持并發(fā)、基于類和面向?qū)ο蟮挠?jì)算機(jī)編程語言。下面列出了面向?qū)ο筌浖_發(fā)的優(yōu)點(diǎn): 代碼開發(fā)模塊化,更易...
    安安靜靜寫代碼閱讀 1,148評(píng)論 0 8
  • Java 面試題 整理自??途W(wǎng) 什么是Java虛擬機(jī)?為什么Java被稱作是“平臺(tái)無關(guān)的編程語言”? Java虛擬...
    GuaKin_Huang閱讀 10,760評(píng)論 19 265
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,871評(píng)論 18 399
  • 剛剛畢業(yè)那會(huì),青春年少。以為只要姿態(tài)放的足夠低,態(tài)度足夠謙遜,為人足夠有眼色,終歸是可以融入職場(chǎng)的?,F(xiàn)在想想真是少...
    云水琉璃閱讀 1,362評(píng)論 0 1
  • 我跟我老公第一次見面時(shí)是15年前,我上高中,他好像剛上初一吧,一個(gè)在北一個(gè)在南,我是四川人,他是東北人,因?yàn)槲腋改?..
    糖圖圖閱讀 231評(píng)論 0 1

友情鏈接更多精彩內(nèi)容