原文鏈接:http://www./Articles/333596/What-devs-should-know-about-Javascript
這篇文章中,我將介紹一下javascript最重要的一些關(guān)鍵點。當然你學習的前提你自己還必須是一個有經(jīng)驗的程序員以及一點點去學習js的意愿,而且雖然這篇文章主要是針對C#以及JAVA開發(fā)者來教學的,但如果你習慣了你一樣會學到很多有用的東西。 Javascript的語言家族 顧名思義,javascript這個名稱表示它是基于java的,和java差不多的類C語言,然而,javascrip并不屬于類C語言家族,它實際上是Java,Scheme,Perl以及它自己的混合衍生物。 膚淺的去看,你應(yīng)該能馬上習慣javascript,因為它的語法與java很相像,也有分支結(jié)構(gòu)括號,分號以及if-for-while-do-switch-throw-catch-finally關(guān)鍵字,我想已經(jīng)適應(yīng)了C#/Java的你肯定會喜歡。 動態(tài)類型 與C#/Java的靜態(tài)類型語言不同,JS是動態(tài)類型的,也就是說JS變量能夠任意改變它的類型,而且你也無法為方法去定義明確的返回類型,如下面的代碼段這是典型的靜態(tài)類型語言 int x = 5; x = "hello"; 如果我們馬上編譯代碼的話,顯然會拋出一個TypeError的異常。但JS卻不會,哪怕變量的類型都改變了。 var x = 5; x = "hello"; 因為在JS中,變量的類型本身就是可以改變的,編譯器根本不知道這些變量將代表什么,所以你也別對JS的編譯器抱太多期望,因為編譯時檢錯有點垃圾以至于你必須更多地在程序運行時進行更多的測試來找出潛在的BUG。 弱類型 JS也是弱類型語言,意味著JS可以為變量做任何的隱形類型轉(zhuǎn)換,這樣大家可要小心了。在強類型語言中,編譯器會進行檢錯看能否進行轉(zhuǎn)換。比如代碼2+"3"將會提示錯誤。然而在JS將會直接將數(shù)字轉(zhuǎn)換成字符串,或者bool變量,空數(shù)組轉(zhuǎn)換成數(shù)字,甚至其他什么東西轉(zhuǎn)換成bool變量。。。這一切都是你無法預(yù)見的。 雖然弱類型會產(chǎn)生很多你無法預(yù)料的結(jié)果。但依然有兩個非常重要的關(guān)鍵點我們必須去記?。?/div> 第一,JS有 == 操作符,你也許會以為這個與其他語言的 == 操作符一個意思,但很不幸的是它不是,如果兩個不同類型的變量進行 == 操作符比較的話,JS將會嘗試轉(zhuǎn)換它們的類型為一致,然后才進行等值判斷。所以請注意下面的代碼,這些代碼在JS中是肯定返回true的。 123 == "123" true == 1 false == "0" [] == "" {} == "[object Object]" 不過,幸運的是,JS還是有嚴格的等值判斷操作符的 === 與 !==,如果兩個變量類型不一致的話,=== 是肯定會返回false的,所以你現(xiàn)在應(yīng)該知道在關(guān)鍵場合你應(yīng)該使用什么等值判斷操作符了吧! 第二,JS將總是將 if 語句的表達式轉(zhuǎn)換成bool值,以下這些代碼在if判斷語句中將會被認為是false。 false null undefined 0 "" NaN 請記住除此以外,任何其他類型的表達式在JS中都被認為是true。 數(shù)據(jù)類型 請牢記,JS只包含一種數(shù)據(jù)類型,這種數(shù)據(jù)類型與你熟悉語言的double幾乎是一樣的,因為整數(shù)如果進行除法運算的話,可能運算結(jié)果會與你的預(yù)期有出入。同時也請牢記在JS中的數(shù)據(jù)位移以及位運算比較都是很消耗資源的運算,因為運算前必須先將double轉(zhuǎn)換成整數(shù),運算后再將整數(shù)重新轉(zhuǎn)換為double 數(shù)組 在JS中只存在于一種數(shù)組,我們稱為arrays,當你想使用類似其他語言的lists,arrays,vectors,sets或者tuples時,arrays是你唯一的選擇,注意array的容量大小是可動態(tài)改變的,而且數(shù)組的每一個元素也可以是不同的類型。 你可以像這樣聲明一個數(shù)組: var array1 = []; //empty array var array2 = [1, "hello", null, ["bye", 0]]; //array with stuff in it 看上去確實很簡單,但我還是要建議你參考 array functions in Javascript 去了解更多關(guān)于JS中的數(shù)組用法。 對象 因為對象的多變性,對象在JS中可以說是最有特性的元素了,JS里的對象類似一個關(guān)聯(lián)的字典集合,在左邊你能看到字典的關(guān)鍵詞,與之對應(yīng)在右邊你能看到該關(guān)鍵詞對應(yīng)的值,這個值甚至是其他對象或者一個方法。 在JAVA/C#中,你肯定要使用大量的類,但在JS中,你可以更簡潔地使用對象完成同樣的目的。 比如這是一個Person類 class Person { public string name = "John"; public int age = 25; public string occupation = "programmer"; } 在JS中,你可以使用對象完成同樣的任務(wù) var person = { name: "John", age: 25, occupation: "programmer" }; 但如果你要實現(xiàn)更加復(fù)雜的類呢?比如有構(gòu)造方法,私有字段以及方法的時候你該怎么做呢? class Person { private string name; private int age; private string occupation; public Person(string name, int age, string occupation) { this.name = name; this.age = age; this.occupation = occupation; } public string GetDescription() { return name + " is a " + age + " year old person that earns money as a " + occupation + "."; } } 比如現(xiàn)在你可以實例化一個Person然后獲取他的描述 Person John = new Person("John", 25, "programmer"); string biographyOfJohn = John.GetDescription(); 在JS中沒有類而只有簡潔的對象。我們這里看看如何使用對象來完成上面的功能: function Person(name, age, occupation) { return { name: name, age: age, occupation: occupation, getDescription: function() { return name + " is a " + age + " year old person that earns money as a " + occupation + "."; } }; } 現(xiàn)在,你也可以通過下面的代碼來初始化一個Person然后也獲取他的描述了 var John = Person("John", 25, "programmer"); var biographyOfJohn = John.getDescription(); 方法 JS的方法與C#/JAVA是不一樣的,C#/JAVA的方法是直接屬于類的,你可以為某個方法分配變量,傳遞參數(shù),獲取方法的返回值或者之際將方法作為數(shù)組的元素以及對象的某個值。 在JS中,有兩種定義方法的標準語法: function name(arguments) { //function body return returnValue; }或 var name = function(arguments) { //function body return returnValue; } 這兩個不同語法的唯一區(qū)別就是第一個將自動將自己置于程序的全局,這樣你能夠在定義方法的代碼前就能直接調(diào)用該方法 ( Read more about hoisting in Javascript) 而如果你使用第二個語法規(guī)格的話,你必須在調(diào)用方法前事先定義方法。 范圍 JS只針對方法才有可使用的范圍限制,顯然這與C#/JAVA的塊區(qū)域是不一樣的,所以如果你寫下如下代碼你可能會碰到一些問題 var x = 45; if(condition) { var x = 35; } 通過使用塊,你期望x只是這個塊的局部變量而不會影響到外面的同名變量x。但是在JS中,內(nèi)部的x是會改變外部的同名變量x的。 不過不用擔心,代碼質(zhì)量檢測工具( JSHint)能夠找出這些問題并提醒你。 全局變量 請盡量確保你使用'var'關(guān)鍵字來定義變量,如果不這么做的話,JS將自動認定這些變量就是全局變量。而這將會導致很多很難檢測出來的BUG。 var globalVar = "global variable"; otherGlobalVar = "other global variable"; function doStuff() { alsoGlobal = "unfortunately, this is also a global variable"; }上面示例中,所有變量都是定義為全局變量的,globalVar正常, otherGlobalVar就是一個不好定義方式的典型,而 alsoGlobal這種定義方式顯然是一個更糟糕的方式,這將導致出無法預(yù)測的BUG。 再啰嗦一句,請確保使用 JSHint,可以為你省不少事! 文檔對象模型 DOM(文檔對象模型)不算是JS獨有的東西,但對于JS與網(wǎng)頁通信是非常重要的,但悲劇的是為了在不同的瀏覽器下正常工作,你可能要做非常煩人的工作,一般情況下我就直接建議你使用DOM抽象框架jQuery. 總結(jié): 我能確信你肯定在開發(fā)過程中會碰到更多的JS各個方面的問題,但我希望這篇文章能盡量的講述到其中大量的典型問題,如果你打算好好研究JS的話,這里有幾個非常好的站點值得你去取經(jīng):
|
|