很多人看到 Java 和 JavaScript 都有“Java”四個(gè)字,就以為它們是同一樣?xùn)|西含潘,連我自己當(dāng)初也是這樣饲做。
其實(shí)它們是完完全全不同的兩種東西。
Java调鬓,全稱應(yīng)該是 Java Applet艇炎,是嵌在網(wǎng)頁(yè)中酌伊,而又有自己獨(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 作編程語(yǔ)言一點(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 頁(yè)面熙含,把這個(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í)候(主要是指老版本)自成體系,與其他瀏覽器陣營(yíng)區(qū)別較大勺阐,以及等等原因卷中,反正就是不被一些人喜愛≡ǔ椋可又因?yàn)槭褂萌巳禾珡V泛蟆豫,特別是在中國(guó),所以被吐槽得較多腰吟。哎无埃,我本來不是在講 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ò)的Qā!赂蕴!因?yàn)樯读驗(yàn)?JavaScript 語(yǔ)言實(shí)際上就根本沒有提供對(duì)輸入輸入的支持!8潘怠碧注!而那個(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ū)ο蟮模前」⒌迹F(xiàn)在誰(shuí)要不是面向?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(yǔ)言家族吧邑雅。原型片橡,簡(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í)例的語(yǔ)法掌眠,但實(shí)際上理解起來很繞蕾盯。這里我就不再說這個(gè)梗(geng,還有拼音蓝丙,多貼心)啦级遭,應(yīng)該會(huì)再寫文章詳細(xì)講的。
盡管不是嚴(yán)格意義上的(你問我為什么不是嚴(yán)格意義上的渺尘,我也就是說說挫鸽,好商量嘛)函數(shù)式編程語(yǔ)言,但 JavaScript 中的確是有很多函數(shù)式編程語(yǔ)言的特性鸥跟,例如函數(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 的最大的不同蝙场,諸如語(yǔ)法凌停、語(yǔ)言特性等各種細(xì)節(jié),慢慢再來說嘍售滤。
PS:感覺我寫東西口氣挺輕松吼罚拟,其實(shí)我是個(gè)嚴(yán)肅的人-_-台诗。
文/luobo_tang(簡(jiǎn)書作者)
原文鏈接:http://www.reibang.com/p/8488d306bae9
著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)赐俗,并標(biāo)注“簡(jiǎn)書作者”拉队。