亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

從Java開發(fā)者的視角解釋JavaScript

瀏覽:46日期:2023-11-23 11:58:31

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

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

然而,JavaScript是web的編程語言,最近由于Node.js和JVM自己的Nashorn JavaScript引擎的發(fā)展,在服務(wù)器端獲得了相當(dāng)?shù)淖⒁狻?/p>

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

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

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

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

優(yōu)點(diǎn)編寫一次,差不多處處運(yùn)行!

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

內(nèi)置到我們喜愛的JVM的、輕量級(jí)高性能JavaScript運(yùn)行時(shí)Nashorn,完全能夠解釋JavaScript腳本,還能夠解釋項(xiàng)目中帶有Java代碼的JavaScript腳本。

鑒于每臺(tái)電腦運(yùn)行時(shí)都可獲得的自由,JavaScript成為Java體驗(yàn)的完美延續(xù)。

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

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

這打開了函數(shù)式編程世界的大門,這是結(jié)構(gòu)化JavaScript編程的完美方式。

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

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

這不是沒有依據(jù)的,下面是在JavaScript里定義一個(gè)reduce函數(shù)的例子,來自于《Eloquent JavaScript》一書。

function forEach(array, action) {for (var i = 0; i < array.length; i++) {action(array[i]); //apply action to every element of the arra.}} function reduce(combine, base, array) {forEach(array, function (element) {base = combine(base, element); // and here we apply function passed as ‘combine’ parameter to ‘base’ and ‘element’});return base;} function add(a, b) { // btw, this is how you define a function in JavaScriptreturn a + b;} function sum(numbers) {return reduce(add, 0, numbers);}

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

繼承:就像真實(shí)的世界

JavaScript的繼承是基于原型的。即,你沒有擴(kuò)展了其它類型的類型,而實(shí)際上,你擁有的實(shí)例從其它實(shí)例繼承了功能。

想象一下,對(duì)象A就像一個(gè)映射,我們剛才稍微提到了一些、但是用了不同的視角,然后另一個(gè)類似映射的對(duì)象B從A繼承了一切。

 這說明B可以訪問A所有部分:A的方法、字段等等。

在實(shí)踐中,我從來沒有看到有人實(shí)際使用簡(jiǎn)單的基于原型的繼承。通常當(dāng)某人需要繼承時(shí),他只是構(gòu)造類,因此你可以用到所有廣泛的技能,和基于類的繼承的工作模式。——Rene Saarsoo,XRebel前端工程師

我不太確定Java開發(fā)者應(yīng)該從中吸取什么,但是要當(dāng)心繼承方式的不同,對(duì)于父級(jí)對(duì)象要格外留意、而不要意外地改變整個(gè)程序的行為。

任何時(shí)候要避免的

列出不可靠的JavaScript設(shè)計(jì)上的決定比想象中要容易。在JavaScript程序中要避免的最明顯的地方就是全局變量的聲明。

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

可以開啟strict模式。只需在腳本文件頂部寫上“use strict”,那么不經(jīng)意編寫的全局變量聲明將顯示錯(cuò)誤。

JavaScript與Java另一個(gè)重要的不同點(diǎn)在于,前者是動(dòng)態(tài)類型語言,其真諦是所有東西都可以是任何類型。這很明顯了,實(shí)在不能再強(qiáng)調(diào)了:不要針對(duì)不同類型的值,去復(fù)用相同的變量。

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

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

搞定工作的小提示

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

靜態(tài)代碼分析

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

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

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

REPL

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

激活JavaScript REPL的一種途徑是打開瀏覽器的控制臺(tái),它產(chǎn)生了對(duì)JavaScript代碼求值的界面。

從Java開發(fā)者的視角解釋JavaScript

另一個(gè)比較方便的工具是jjs,它捆綁在JDK1.8。

從Java開發(fā)者的視角解釋JavaScript

它是命令行工具,允許你訪問JDK中的Nashorn JavaScript 引擎,完全有能力執(zhí)行那些甚至最為嚴(yán)格的JavaScript腳本。

測(cè)試

對(duì)于任何一個(gè)項(xiàng)目,你都想運(yùn)行一些測(cè)試。測(cè)試對(duì)于動(dòng)態(tài)類型的語言尤為重要,最好選擇一種測(cè)試框架。我推薦Jasmine,它是用于測(cè)試JavaScript的行為驅(qū)動(dòng)開發(fā)框架。

從Java開發(fā)者的視角解釋JavaScript

在Jasmine,你用describe描述測(cè)試套件,它阻止了你想測(cè)試的代碼訪問。在測(cè)試中的代碼完成后,你expect一些結(jié)果。

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

構(gòu)建工具

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

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

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

結(jié)論

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

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

注1:在計(jì)算機(jī)科學(xué)里,尾調(diào)用是指一個(gè)函數(shù)里的最后一個(gè)動(dòng)作是一個(gè)函數(shù)調(diào)用的情形:即這個(gè)調(diào)用的返回值直接被當(dāng)前函數(shù)返回的情形。這種情形下稱該調(diào)用位置為尾位置。若這個(gè)函數(shù)在尾位置調(diào)用本身(或是一個(gè)尾調(diào)用本身的其他函數(shù)等等),則稱這種情況為尾遞歸,是遞歸的一種特殊情形。尾調(diào)用不一定是遞歸調(diào)用,但是尾遞歸特別有用,也比較容易實(shí)現(xiàn)。http://zh.wikipedia.org/wiki/尾調(diào)用注2:REPL是一個(gè)簡(jiǎn)單的,交互式的編程環(huán)境。這個(gè)詞常常用于指代一個(gè)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)境。這也被稱做交互式頂層構(gòu)件(interactive toplevel)。http://zh.wikipedia.org/wiki/%E8%AF%BB%E5%8F%96%EF%B9%A3%E6%B1%82%E5%80%BC%EF%B9%A3%E8%BE%93%E5%87%BA%E5%BE%AA%E7%8E%AF注3:Maven 除了以程序構(gòu)建能力為特色之外,還提供 Ant 所缺少的高級(jí)項(xiàng)目管理工具。由于 Maven 的缺省構(gòu)建規(guī)則有較高的可重用性,所以常常用兩三行 Maven 構(gòu)建腳本就可以構(gòu)建簡(jiǎn)單的項(xiàng)目,而使用 Ant 則需要十幾行。事實(shí)上,由于 Maven 的面向項(xiàng)目的方法,許多 Apache Jakarta 項(xiàng)目現(xiàn)在使用 Maven,而且公司項(xiàng)目采用 Maven 的比例在持續(xù)增長(zhǎng)。http://www.oschina.net/p/maven注4:從頭編寫HTMLCSSJavascript是上個(gè)世紀(jì)的事情了,如今的JavaScript都是通過CoffeeScript這樣的支持句法縮寫的編輯器寫成的。如果你希望寫完JavaScript能夠一個(gè)工具完成代碼清理優(yōu)化工作,Gulp 就是你的不二之選,GulpJS類似Ant或Maven之于Java。http://www.oschina.net/p/gulp

原文:javascript-explain-it-like-im-a-java-developer 翻譯:labazhou

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 免费看欧美一级特黄α大片 | 亚洲tv成人天堂在线播放 | 黑人狂躁日本妞中文字幕 | 国产精品成人一区二区1 | 亚洲午夜精品国产电影在线观看 | 亚洲精品久久久久久婷婷 | 国产欧美国日产网站 | 欧美艳星性videose精品 | 九九精品免视看国产成人 | 人妖videos人妖xxxx | 欧美成人性色xxxx视频 | 澳门成人免费永久视频 | 又爽又黄又无遮挡的视频美女软件 | 黄色影视在线观看 | 日本黄色片免费观看 | 国产成人精品曰本亚洲77美色 | ww毛片| 成人一级黄色大片 | 日韩免费视频网站 | 在线精品视频在线观看高清 | 小泽玛利亚一区二区 | 免费一级淫片aa | 织田真子中文字幕 | 国产精品免费看久久久 | 欧美日韩免费一区二区三区 | 成人国产精品免费视频 | 日韩精品欧美国产精品亚 | 三级理论中文字幕在线播放 | 精品视频久久久 | 玖草影视 | 国产日比视频 | 伊人久久在线视频 | 久久91亚洲精品久久91综合 | 国产一区二区三区手机在线观看 | 99精品视频不卡在线观看免费 | 久久国产精品亚洲综合 | 精品国内一区二区三区免费视频 | 快色网站| 黄色片视频在线免费观看 | 在线 丝袜 欧美 日韩 制服 | 国产成人亚洲精品蜜芽影院 |