從Java程序員的視角看JavaScript

    我們無法在一篇博文里解釋 JavaScript 的所有細(xì)節(jié)。愛掏網(wǎng) - it200.com如果你正或多或少地涉及了 web 應(yīng)用程序開發(fā),那么,我們的 Java 工具和技術(shù)范圍報告揭示了,大多數(shù)(71%)Java 開發(fā)者被歸到了這一類,只是你對 JavaScript 遇到了阻礙。愛掏網(wǎng) - it200.com

    毫無疑問,你已經(jīng)知道了 Java 和 JavaScript,不管它們有著多么類似的命名,彼此沒有共享太多共通之處。愛掏網(wǎng) - it200.comJava 的靜態(tài)類型、符合直接規(guī)律的簡單語法和冗長,與 JavaScript 的動態(tài)、缺乏一致性原則和怪異,有著巨大的不同。愛掏網(wǎng) - it200.com

    然而,JavaScript 是 web 的編程語言,最近由于 Node.js 和 JVM 自己的 Nashorn JavaScript 引擎的發(fā)展,在服務(wù)器端獲得了相當(dāng)?shù)淖⒁狻?b class="xhide">愛掏網(wǎng) - it200.com

    本文,我不想只是漫談 JavaScript 的好與不好,或重復(fù)任何人都能免費找到的、不計其數(shù)的 JavaScript 教程。愛掏網(wǎng) - it200.com我想列出一些有助于理解 JavaScript 做為一種語言的技術(shù)點,并從接近?horse的角度來理解。愛掏網(wǎng) - it200.com

    我們將在本文包含下列語言級別的技術(shù)點:

    • JavaScript 的通用性
    • JavaScript 的函數(shù)編程問題
    • 不同于 Java 的繼承

    另外,你會找到一些工具方面的推薦,沒有這些工具,你是不想著手 JavaScript 項目的,包含了構(gòu)建系統(tǒng)的代碼質(zhì)量分析和測試框架方面的工具。愛掏網(wǎng) - it200.com

    優(yōu)點

    編寫一次,差不多處處運行!

    毋庸置疑 JavaScript 是 web 編程語言,是很多其它語言的編譯目標(biāo),也是用來證明有時候人們只是想擁有更多自由時間的終極方式。愛掏網(wǎng) - it200.com盡管如此,這不是一件壞事。愛掏網(wǎng) - it200.com每一臺能夠瀏覽現(xiàn)代網(wǎng)站的電腦都裝備了具有性能和可用的 JavaScript 引擎。愛掏網(wǎng) - it200.com最重要的是,JavaScript 代碼可以在后端運行。愛掏網(wǎng) - it200.com

    內(nèi)置到我們喜愛的 JVM 的、輕量級高性能 JavaScript 運行時 Nashorn,完全能夠解釋 JavaScript 腳本,還能夠解釋項目中帶有 Java 代碼的 JavaScript 腳本。愛掏網(wǎng) - it200.com

    鑒于每臺電腦運行時都可獲得的自由,JavaScript 成為 Java 體驗的完美延續(xù)。愛掏網(wǎng) - it200.com

    函數(shù)式編程:一等公民是函數(shù),而不是遞歸

    JavaScript 中的函數(shù)是第一類公民,它們是值,可被存儲在變量里、傳遞給其它函數(shù)、在適當(dāng)?shù)臅r候再執(zhí)行。愛掏網(wǎng) - it200.com

    這打開了函數(shù)式編程世界的大門,這是結(jié)構(gòu)化 JavaScript 編程的完美方式。愛掏網(wǎng) - it200.com

    注意,JavaScript 里的對象是任何東西的映射,對象的每個特性(attribute)都在同一個映射里:函數(shù)、屬性(property)、構(gòu)造器;易變性帶來了更大的隱患,而對于 Java,你至少能夠確保方法和字段結(jié)構(gòu)在某種程度上是穩(wěn)定的。愛掏網(wǎng) - it200.com

    反過來,這使得函數(shù)式編程更加有利:涉及到小的、可理解函數(shù)和不變的數(shù)據(jù)結(jié)構(gòu)是在 JavaScript 里運行的方式。愛掏網(wǎng) - it200.com

    這不是沒有依據(jù)的,下面是在 JavaScript 里定義一個 reduce 函數(shù)的例子,來自于《Eloquent JavaScript》一書。愛掏網(wǎng) - it200.com

    function forEach (array, action) {
    for (var i = 0; i 
    

    注意:我們沒有在這里使用 reduce 的遞歸版本。愛掏網(wǎng) - it200.comJavaScript 沒有以尾調(diào)用【注1】為特色,這意味著每個函數(shù)的遞歸版本都將用到棧的深度,和 Java 一樣,如果你遞歸太深,程序就崩潰。愛掏網(wǎng) - it200.com

    繼承:就像真實的世界

    JavaScript 的繼承是基于原型的。愛掏網(wǎng) - it200.com即,你沒有擴展了其它類型的類型,而實際上,你擁有的實例從其它實例繼承了功能。愛掏網(wǎng) - it200.com

    想象一下,對象A就像一個映射,我們剛才稍微提到了一些、但是用了不同的視角,然后另一個類似映射的對象B從A繼承了一切。愛掏網(wǎng) - it200.com

    這說明B可以訪問A所有部分:A的方法、字段等等。愛掏網(wǎng) - it200.com

    在實踐中,我從來沒有看到有人實際使用簡單的基于原型的繼承。愛掏網(wǎng) - it200.com通常當(dāng)某人需要繼承時,他只是構(gòu)造類,因此你可以用到所有廣泛的技能,和基于類的繼承的工作模式。愛掏網(wǎng) - it200.com

    ——Rene Saarsoo,XRebel 前端工程師

    我不太確定 Java 開發(fā)者應(yīng)該從中吸取什么,但是要當(dāng)心繼承方式的不同,對于父級對象要格外留意、而不要意外地改變整個程序的行為。愛掏網(wǎng) - it200.com

    任何時候要避免的

    列出不可靠的 JavaScript 設(shè)計上的決定比想象中要容易。愛掏網(wǎng) - it200.com在 JavaScript 程序中要避免的最明顯的地方就是全局變量的聲明。愛掏網(wǎng) - it200.com

    注意,在 JavaScript 里,無論什么時候,不使用 var 關(guān)鍵詞定義變量,那么定義的變量被推到了它們被定義的作用域頂端。愛掏網(wǎng) - it200.com這意味著,每個用這種方式定義的變量將跑到全局范圍頂部,這會引發(fā)沖突以及你和同事不可預(yù)期的頭痛。愛掏網(wǎng) - it200.com

    可以開啟?strict 模式。愛掏網(wǎng) - it200.com只需在腳本文件頂部寫上“use strict”,那么不經(jīng)意編寫的全局變量聲明將顯示錯誤。愛掏網(wǎng) - it200.com

    JavaScript 與 Java 另一個重要的不同點在于,前者是動態(tài)類型語言,其真諦是所有東西都可以是任何類型。愛掏網(wǎng) - it200.com這很明顯了,實在不能再強調(diào)了:不要針對不同類型的值,去復(fù)用相同的變量。愛掏網(wǎng) - it200.com

    跟蹤剛開始是個 string 類型的變量,但是現(xiàn)在它成了浮點數(shù)、或者函數(shù)了,相信我!

    還有,我不想太深入類型和布爾值的討論,但是要警惕 JavaScript 引擎扔給你的隱式類型轉(zhuǎn)換。愛掏網(wǎng) - it200.com

    搞定工作的小提示

    正如我上面提到的,在編程上要更加注意這種語言的語法和怪癖,而不僅僅是知道。愛掏網(wǎng) - it200.com項目很少由于語言的不足而失敗,更多的失敗是與總體項目框架不足有關(guān)。愛掏網(wǎng) - it200.com下面是有助于你交付項目的一些工具。愛掏網(wǎng) - it200.com

    靜態(tài)代碼分析

    大部分項目是不同的,其復(fù)雜度和需求導(dǎo)致了大量的細(xì)節(jié),你該如何著手代碼庫呢。愛掏網(wǎng) - it200.com盡管如此,在所有地方都有一致性的目標(biāo),那就是代碼質(zhì)量。愛掏網(wǎng) - it200.com

    是的,代碼質(zhì)量,對于任何開發(fā)者來說,最重要的工作就是交付。愛掏網(wǎng) - it200.com但是不要在質(zhì)量上妥協(xié),不要對你提交的代碼感到不自信就不情愿與同事分享。愛掏網(wǎng) - it200.com

    幸運的是,JavaScript 有一套得體的解決方案——JSHint。愛掏網(wǎng) - it200.comJSHint 是為 JavaScript 量身打造的靜態(tài)分析工具,與應(yīng)用于 Java 代碼的 FindBug 類似。愛掏網(wǎng) - it200.comJSHint 可以在你的代碼庫運行,并高亮出可疑的或有問題的地方,即使你不會馬上產(chǎn)生 bug,但這些地方將來變得難以維護(hù)。愛掏網(wǎng) - it200.com在項目中支持它相當(dāng)簡單。愛掏網(wǎng) - it200.com幫自己一個忙——如果你在寫 JavaScript 代碼,就用 JSHint 讓它更安全、少一些尷尬。愛掏網(wǎng) - it200.com

    REPL

    REPL 代表“讀取-求值-輸出”循環(huán)(Read-Eval-Print Loop)【注2】,是很多動態(tài)語言的強大工具。愛掏網(wǎng) - it200.com如果你看過 Scala 或 Groovy,你一定能夠理解這個概念。愛掏網(wǎng) - it200.com

    激活 JavaScript REPL 的一種途徑是打開瀏覽器的控制臺,它產(chǎn)生了對 JavaScript 代碼求值的界面。愛掏網(wǎng) - it200.com

    另一個比較方便的工具是 jjs,它捆綁在 JDK1.8。愛掏網(wǎng) - it200.com
    它是命令行工具,允許你訪問 JDK 中的 Nashorn JavaScript 引擎,完全有能力執(zhí)行那些甚至最為嚴(yán)格的 JavaScript 腳本。愛掏網(wǎng) - it200.com

    測試

    對于任何一個項目,你都想運行一些測試。愛掏網(wǎng) - it200.com測試對于動態(tài)類型的語言尤為重要,最好選擇一種測試框架。愛掏網(wǎng) - it200.com我推薦?Jasmine,它是用于測試 JavaScript 的行為驅(qū)動開發(fā)框架。愛掏網(wǎng) - it200.com

    在 Jasmine,你用 describe 描述測試套件,它阻止了你想測試的代碼訪問。愛掏網(wǎng) - it200.com在測試中的代碼完成后,你 expect 一些結(jié)果。愛掏網(wǎng) - it200.com

    很明顯這里不是要給出教程,但是我想讓你一瞥 JavaScript 代碼看起來是多么地優(yōu)雅。愛掏網(wǎng) - it200.comJasmine 是 JavaScript 項目最好的實踐之一,我們私下在產(chǎn)品開發(fā)中應(yīng)用到了 ZeroTurnaround 項目,尤其是對于富含 JavaScript 的不間斷運行的交互分析器?XRebel。愛掏網(wǎng) - it200.com

    構(gòu)建工具

    最后,你的項目將需要的、比較重要的是構(gòu)建工具。愛掏網(wǎng) - it200.com如果你在 Java 項目中使用 JavaScript,請確保你可以避開 Java 構(gòu)建工具,這就差不多足夠了。愛掏網(wǎng) - it200.com但是,對于獨立的 JavaScript 項目,沒有必要引入龐然大物—Maven【注3】。愛掏網(wǎng) - it200.com

    可以考慮的 JavaScript 項目用到的構(gòu)建工具是?GulpJS【注4】。愛掏網(wǎng) - it200.com它是基于插件的構(gòu)建系統(tǒng),你可以為其指定任務(wù)。愛掏網(wǎng) - it200.com任務(wù)可以是“拷貝 src 目錄下的 .js 文件到 dest”、或“壓縮我的 JavaScript 代碼用于生產(chǎn)環(huán)境”。愛掏網(wǎng) - it200.com讓人受到震動的是,GulpJS 把任務(wù)相關(guān)的文件流加入過濾器,因此你可以把上面的兩個任務(wù)加入一次有效的清掃中。愛掏網(wǎng) - it200.com

    還有大量的可用插件,借助適當(dāng)?shù)臉?gòu)建系統(tǒng),你將發(fā)現(xiàn)項目中的協(xié)作會輕松很多。愛掏網(wǎng) - it200.com

    結(jié)論

    我們只是看到了 JavaScript 的冰山一角,并盡量介紹一些 Java 開發(fā)者在解決 JavaScript 時應(yīng)該知道的概念和工具。愛掏網(wǎng) - it200.com自然地,這里沒有提供要學(xué)習(xí)的完整的技術(shù)清單,但是如果你正準(zhǔn)備義無反顧地深入 JavaScript 項目,這會幫助你起步,擁抱 JavaScript 的怪癖將有助于你不會頻繁地沮喪。愛掏網(wǎng) - it200.com

    你了解讓 JS 開發(fā)者走向快樂的秘密或最佳實踐嗎?毫無疑問應(yīng)該去分享!在下面評論或在 Twitter:@shelajev?上與我交談。愛掏網(wǎng) - it200.com我樂于聽到你的想法!

    • 注1:在計算機科學(xué)里,尾調(diào)用是指一個函數(shù)里的最后一個動作是一個函數(shù)調(diào)用的情形:即這個調(diào)用的返回值直接被當(dāng)前函數(shù)返回的情形。愛掏網(wǎng) - it200.com這種情形下稱該調(diào)用位置為尾位置。愛掏網(wǎng) - it200.com若這個函數(shù)在尾位置調(diào)用本身(或是一個尾調(diào)用本身的其他函數(shù)等等),則稱這種情況為尾遞歸,是遞歸的一種特殊情形。愛掏網(wǎng) - it200.com尾調(diào)用不一定是遞歸調(diào)用,但是尾遞歸特別有用,也比較容易實現(xiàn)。愛掏網(wǎng) - it200.com
    • 注2:REPL 是一個簡單的,交互式的編程環(huán)境。愛掏網(wǎng) - it200.com這個詞常常用于指代一個 Lisp 的交互式開發(fā)環(huán)境,但也能指代命令行的模式和例如 APL, BASIC, Clojure, F#, Haskell, J, Julia, Perl, PHP, Prolog, Python, R, Ruby, Scala, Smalltalk, Standard ML, Tcl, Javascript 這樣的編程語言所擁有的類似的編程環(huán)境。愛掏網(wǎng) - it200.com這也被稱做交互式頂層構(gòu)件(interactive toplevel)。愛掏網(wǎng) - it200.com
    • 注3:Maven 除了以程序構(gòu)建能力為特色之外,還提供 Ant 所缺少的高級項目管理工具。愛掏網(wǎng) - it200.com由于 Maven 的缺省構(gòu)建規(guī)則有較高的可重用性,所以常常用兩三行 Maven 構(gòu)建腳本就可以構(gòu)建簡單的項目,而使用 Ant 則需要十幾行。愛掏網(wǎng) - it200.com事實上,由于 Maven 的面向項目的方法,許多 Apache Jakarta 項目現(xiàn)在使用 Maven,而且公司項目采用 Maven 的比例在持續(xù)增長。愛掏網(wǎng) - it200.com
    • 注4:從頭編寫 HTMLCSSJavascript 是上個世紀(jì)的事情了,如今的 JavaScript 都是通過 CoffeeScript 這樣的支持句法縮寫的編輯器寫成的。愛掏網(wǎng) - it200.com如果你希望寫完 JavaScript 能夠一個工具完成代碼清理優(yōu)化工作,Gulp 就是你的不二之選,GulpJS 類似 Ant 或 Maven 之于 Java。愛掏網(wǎng) - it200.com

    為了學(xué)習(xí)工作與休閑娛樂互不沖突,現(xiàn)新建圈【碼農(nóng)茶水鋪】用于程序員生活,愛好,交友,求職招聘,吐槽等話題交流,希望各位大神工作之余到茶水鋪來喝茶聊天。愛掏網(wǎng) - it200.com群號:582735936

    獲得更多視頻資料點擊

    聲明:所有內(nèi)容來自互聯(lián)網(wǎng)搜索結(jié)果,不保證100%準(zhǔn)確性,僅供參考。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系我們進(jìn)行處理。
    發(fā)表評論
    更多 網(wǎng)友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 国产一区二区三区在线免费| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 久久伊人精品一区二区三区 | 国产精品亚洲午夜一区二区三区| 精品亚洲福利一区二区| 日本亚洲成高清一区二区三区| 福利一区二区三区视频午夜观看| 在线精品视频一区二区| 日韩人妻一区二区三区免费| 久久亚洲色一区二区三区| 精品一区二区三区在线观看l| 亚洲av不卡一区二区三区| 国产免费播放一区二区| 无码人妻一区二区三区精品视频| 日韩视频一区二区在线观看| 亚洲乱码一区二区三区国产精品| 日本高清不卡一区| 黑人大战亚洲人精品一区| 国产成人无码精品一区在线观看 | 一区二区三区亚洲视频| 精品一区二区三区在线观看l | 精品无码一区二区三区爱欲| 亚洲国产精品一区二区三区久久| 国产视频一区在线播放| 国产高清视频一区二区| 福利一区二区在线| 久久无码人妻精品一区二区三区 | 亚洲综合一区国产精品| 亚洲欧洲无码一区二区三区| 女同一区二区在线观看| 国产亚洲福利一区二区免费看 | 精品少妇人妻AV一区二区| 国产成人av一区二区三区在线| 国产人妖视频一区在线观看| 国产一区二区三区韩国女主播| 亚洲一区精彩视频| 国产中文字幕一区| 国产一区在线播放| 久久成人国产精品一区二区 | 一区在线免费观看| 亚洲色精品vr一区二区三区|