JavaScript:語言精粹

本文根據Douglas Crockford的《The Good Parts of JavaScript and the Web》的課程內容整理而成。 還參考了一些其餘資料在文章結尾部分標出。javascript

另外我將課程視頻翻譯一下,連接在這裏呀《JavaScript語言精粹》java

  • 第一節:這就是JavaScript
  • 第二節:函數是第一公民
  • 第三節:進擊的Ajax
  • 第四節:ES5的新世界
  • 第五節:函數趣事
  • 第六節:安全的本質
  • 第七節:同步的控制
  • 第八節:更好的將來

##第一節:這就是JavaScript程序員

  • JavaScript歷史
  • Object
  • Number
  • Boolean 和 String
  • Array
  • Date,RegEx,&Type
  • JavaScript語法
  • JavaScript語句

JavaScript歷史

在伊利諾伊大學厄本那 - 香檳分校的國家超級計算應用中心,有許多孩子正在爲互聯網開發應用程序。那時有許多協議被考慮用於在互聯網上向人們傳輸信息,這些方法有WAIS,Archie,Gopher,FTP,Finger,和其餘一些協議還有萬維網,人們並不知道哪個會贏。因此他們寫了一個適用於全部人的應用程序,他們叫它 Mosaic(全球最先一款能夠顯示圖片的瀏覽器)。由於這種方式實現了在萬維網上的瀏覽功能,萬維網贏得了勝利。他們作的事情是他們想出了一個叫作圖片標籤的東西,它可以在網頁上顯示圖片,這是其餘方式沒法輕易作到的,由於網頁能夠顯示圖像,是它讓萬維網贏了今後進入了快速的發展。web

這個項目中的一些人來到了加州,在那裏他們成立了一個叫網景的公司,網景公司製做了第一款商業瀏覽器叫網景導航者(Netscape Navigator),這是一個巨大的轉折。他們還增長了一系列新功能,他們還想讓終端用戶的程序變得更簡單。它們想作一個相似Mac上HyperCard的程序,HyperCard是一個能夠建立簡單的應用程序的應用。他們也想讓瀏覽器實現這些功能,因此他們把這項工做交給Brendan Eich。他曾經是Silicon Graphics的內核程序員,正則表達式

他的想法時寫一個scheme的解釋器去實現,可是他被告訴不要用scheme。去作一我的們喜歡的,流行的語言,類是於Java或者VB,這語言是給小孩準備的。因此他花了10天建立了新的交互形式的瀏覽器屬性,而後又花了10天去設計和實現了一個新的語言。他拿來了編程

  • Java中的語法
  • Scheme中的函數
  • Self中原型的概念

網景給它取名 LiveScript。網景公司瀏覽器的大獲成功引發了微軟的注意。同時,在太陽公司設計出了Java語言,能夠經過Java虛擬機來擺脫微軟。而後也用Java語言作了一個瀏覽器叫「HotJava」,也很是成功。微軟哪能對它們會坐視無論。因此爲了一塊兒抵抗微軟,網景和太陽公司說咱們聯盟吧。第一步的計劃是,在Netscape瀏覽器中加入Java,而後太陽公司不接着開發「HotJava」瀏覽器了。第二步,太陽公司跟網景說,你別整你那LiveScript了,你直接用個人Java。網景公司不一樣意,首先是由於Netscape瀏覽器用Java的方式是用LiveScript接口與瀏覽器進行通訊的。若是大改的話,影響發版啊。我哪等的起。要不我把名改爲從LifeScript改成JavaScript吧。咱就說這是Java的一個子集,Java的小弟弟。太陽公司說也行吧。因而哥倆手拉手出去開個發佈會,說了這個謊。因此到今天還有人覺得他倆是親兄弟呢,清醒一點,一點血緣關係都沒有,兩個媽兩個爹的~哈哈。數組

微軟那邊也沒閒着,先是買了一個作瀏覽器的公司叫Spyglass,而後把它們的瀏覽器改個名叫IE。下一步,差啥了?對,缺個JavaScript。別閒着,弄吧。微軟團隊作事那叫一個認真啊,無論是JavaScript的錯誤,bug,仍是設計缺陷,同樣沒改的都給逆向實現了。作完了也不能叫JavaScript,由於Sun擁有JavaScript商標。那咱們就叫它Jscript吧。瀏覽器

網景公司開始擔憂,這樣整不完了嘛,趕忙我得整個語言的標準。而後他們去找到W3C。W3C說,滾,沒工夫搭理你。接着又去找了ISO,ISO也沒吱聲。最後總算找到了歐洲計算機制造商協會(ECMA)。ECMA說那咱得成立個委員會啊。而後微軟加入了委員會而且佔了主導地位,最後這個標準也是基於微軟的文檔製做的。那這個標準咱們也得起個名,那就用工做委員會名稱把叫 ECMAScript。Douglas在課上說這真TM難聽~哈哈哈哈安全

如今用的大多數版本是1999年12月出版的IE第三版。而後作了第四版,版本持續了十年最後被放棄了。 在2009年,出版了第五版定義了兩種語言,嚴格的和默認的。2015年,第六版發佈。後邊咱們會用到ES6。如今咱們回過頭來想一想,JavaScript很差的地方來自哪呢?bash

  • 一個是遺留下來的,任何語言中發生的不少事情都是重複之前語言中發生的錯誤
  • 另一些是好的願望,一些特性被加到語言中,但願它變得簡單,可是失敗了。
  • 最後就是匆忙了,十天時間對於設計和實現編程語言來講過短。

Object

在JavaScript中,對象是一個可變鍵值對的集合。每一個屬性都有一個在該對象中惟一的鍵(key)字符串。這個鍵(key)能夠存聽任何值。而後你能夠對對象進行讀取,設置和刪除。

  • Get:可使用點表示法或方括號表示法從對象獲取屬性,方括號中的表達式是一個字符串,這樣能夠動態訪問
  • Set:經過簡單的賦值操做
  • Delete:可使用delete操做符從對象中刪除屬性,少看被用過

須要注意的是 鍵必須是字符串 ,將任何類型放到方括號中,但JavaScript會將其轉換爲字符串。一旦建立一個對象,就會擁有這些方法。

能夠用對象自面量的方法去建立一個對象。若是對象中屬性命名的字段是合法的標識符,就沒必要加上引號。否則要加上引號。

大多數經典的面嚮對象語言,它們都是建立類,而後對象是類的實例,而且類繼承自其餘的類。JavaScript有一個更簡單,更先進的設計。它是基於原型(prototype),其中對象繼承自對象。 這是一種委託(delegation )繼承的方式。咱們用Object.create()方法去實習。

下面的這個例子,

  • 咱們先用字面量的方法來建立一個mother的對象,有a、b兩個屬性。全部經過對象字面量的方法建立的對象都鏈接到Object.prototype,這個JavaScript中標準的對象。
  • 而後使用object.create(mother)方法建立一個daughter的對象,繼承自mother。
  • 若是讓daughter的b加2,自己沒有值b是繼承mother的值b。因此加完等於4,把它存放在daughter對象中。

讀取操做是沿着原型鏈進行查找的,儲存操做將始終在最外的對象中


Number

在JavaScript中,Number是一個比Java更簡單的數字系統,沒有ints(原始類型整數) and integers(包裝類型整數)。它基於IEEE-754標準的64位二進制浮點,在Java和其餘語言中被叫成雙重浮點。

  • 這樣就有一個缺陷就是交換律不在生效。
  • 最大數字是9千萬億,以上數字會失真。

由於咱們用二進制浮點表示小數部分,因此小數部分是進行模擬的,這樣就會出現。

0.1 + 0.2 == 0.30000000000000004;
複製代碼

Number是一個基本包裝類型,因此他有繼承自number.prototype的方法。

不過與對象不一樣的是,對象的生命週期。

let a = 0.30000000000000004;

let b = a.toFixed(2) //生命週期存在與這一行代碼中。

------------------

let a = new Number(0.30000000000000004); //在調用方法時會建立一個Number類型的一個實例
let b = a.toFixed(2); //在實例上調用指定的方法
a = null;             //銷燬這個實例
複製代碼

這意味着咱們不能在運行時調加方法。

Java在擁有一個單獨的數學對象,當時Java是由於考慮到計算機的配置,準備在低配的電腦中將數學函數的功能刪除,但計算機的配置愈來愈高,這並無發生。JavaScript也拿來了這個Math對象。

  • 還有一個特殊的數字NaN, NaN表明沒有定義或者錯誤的運算。NaN不等於NaN
  • 值Infinity表明極大值

Boolean 和 String

Boolean有兩個值true 和 false

String字符串是不可改變的,一旦你建立一個字符串,它就沒法更改。因此說不管你在 string 類型上調用何種方法,都不會對值有改變。

String能夠用單引號或者雙引號的字面量方式來表示。建議雙引號程序以外的字符串好比URL等。 單引號用於程序以內的,好比屬性等。

字符串和數字之間能夠相互轉化:字符串轉化成爲數字

  • 用Number( )函數
  • 用一元加操做符
  • 用parseInt函數

parseInt是從Java借鑑來的東西,它會將值轉換爲數字,但會在第一個非數字字符處中止解析,而且不返回任何緣由。這個設計很是糟糕,因此不推薦使用它。

數字轉化成爲字符串:

  • 用toString方法
  • 用String 函數

字符串有以下這些方法


Array

數組是基本數據結構之一。當JavaScript的第一個版本並無數組,咱們只能使用對象。經過傳遞數字,數字變成字符串,相似數組同樣的工做。如今有了數組的數據類型,它繼承自object,索引轉換爲字符串。

咱們能夠建立一個數組用對象字面量,數組有一個特定的長度屬性,而且該屬性老是比最高整數下標大1。能夠經過設置它的當前長度去添加數組。

Arrays有一套比對象更有趣的方法,對象幾乎沒有來自原型的有用方法,這些方法都存儲在array.prototype中,很是有用。

例如,有sort方法,咱們能夠在其中獲取一組數字,它正在對字符串進行排序。sort能夠採用一個函數參數來接收值對,並根據它們的相對大小返回-1,0或1。因此你能夠覆蓋這種可怕的行爲。

arr.sort((a,b)=>a-b);  //數字從大到小排序
複製代碼

個人建議用對的那個,當名稱是任意字符串時使用對象,當名稱是連續整數時使用數組,不要被術語所迷惑。


Date,RegEx,&Type

Date函數,它的靈感來自Java的Date類,當它在1995年被推出時,還存在 Y2K(千年蟲)bug,但終究咱們倖免於難。它已被修復,因此咱們如今能夠用了。

咱們也獲得了正則表達式,它是從Perl 4借來。這是一個匹配正則表達式文字的正則表達式,但正則表達式必須連在一塊兒寫,因此對於很長的正則就變得很難讀懂。

你能夠經過Regulex這個網站,可以用鐵路圖來表示正則,強烈推薦。

在JavaScript中,全部的值都是對象,除null和undefined以外,它們有時被稱爲底值。它們很類似,但並不徹底相同,因此不能互換。因此我建議只使用其中一個,選擇使用的是undefined,由於這是語言自己使用的那個,它是變量和參數的默認值。若是試圖檢索對象中不存在一個屬性,它不會報錯,它會給你undefined。

JavaScript中有一個type運算符,它將返回一個字符串來標識數據類型。

  • 你傳遞一個數組,它將返回object,這不是一個技術上的錯誤,由於它是對象,可是這樣很沒有用。你能夠用Array.isArray去判斷是不是一個數組
  • 你傳遞一個null,它將返回object,這就是一個設計上的錯誤。沒有啥理由。更糟糕的是,你想去判斷是不是一個對象的時候,還有一個null值,由於它不是對象。(《js高程》上說null返回對象,是爲了表示變量將來是一個對象。總之這是一個很差的設計吧。)

JavaScript有一點很蠢,它的每個值都是真或者爲假

  • 假值有false,null,undefined,空字符串,0,and NaN
  • 剩下全部值都是真,包括字符串0,和字符串false,全部的對象數組甚者它們是空的

JavaScript是一種鬆散類型的語言,任何這些類型均可以存儲在任何變量中,或做爲參數傳遞給任何函數。這很好,由於在強類型語言中,你最終會花費大量時間來對付類型系統,但其實效果並無那麼好。

所以在JavaScript中,對象是經過引用而不是經過值傳遞,這意味着不會複製對象。事實上,在JavaScript中沒有簡單的方法來複制一個對象。 「===」運算符比較對象引用,所以只有當兩邊都是同一個對象時它纔會爲真


JavaScript語法

JavaScript在語法上是C家族的一員,咱們有標識符,能夠以字母、下劃線、美圓符號開始

咱們擁有與C類語言相同的運算符集,其中一些工做方式有點不一樣,這是你須要注意。JavaScript一個重大錯誤是加號運算符同時執行加法和鏈接。這是從Java學到的壞習慣,在Java中,它並非那麼糟糕,由於它強類型。JavaScript是鬆散的類型,若是它們都是數字,它會將它們相加。不然,它會將它們轉換爲字符串並將它們鏈接起來,這很糟糕。

咱們已經談過雙平等號及其存在的問題,建議你老是使用三等號。

  • 邏輯符「&&」的工做方式,若是第一個操做數是真實的,則結果是第二個操做數的值。否則,結果爲一個操做數的值,所以第二個操做數將不會判斷,它確實會短路。
  • 邏輯「||」是工做與它類似的
  • 「!」是邏輯非運算符
  • 若是你有!!,!兩次,它會將值變爲布爾值


JavaScript語句

咱們有一套你指望在C語言中看到的語句,一樣有一些差別。

咱們有break標籤,因此,若是你有嵌套循環和switch這些東西,這很好。

咱們有for語句能夠用來迭代數組,但我不建議使用它。在ES5中,咱們有了forEach和map方法,你能夠在數組的每一個元素上調用一個函數。這幾乎消除了對for循環的全部需求,所以咱們再也不使用for循環了。

咱們有一個for in語句,它遍歷對象的全部屬性的名稱,不幸的是,它還會遍歷全部繼承的屬性,這些屬性一般是你的方法。所以你的方法會與你的數據混淆而且變得一團糟,幸運的是,在ES5中咱們獲得了Object.keys。它接受一個對象並返回一個字符串數組,這些字符串只是對象的可枚舉的屬性。因此我也建議不要使用For in。

關於switch語句的只有一件事,JavaScript改進了switch語句,即switch值不須要是一個數字 它能夠是一個字符串。

JavaScript中有異常處理,這很好。在ES3以前咱們沒有,這意味着你必需要寫永遠不會出錯的程序,由於沒有辦法恢復。因此咱們如今有異常,你能夠throw任何價值。

異常處理很是簡單,只有一個捕獲塊,它能夠捕獲一切,但它並不關心發生了什麼


好啦~~~下一章是函數~ 這篇文章還有些想加的東西,我慢慢加~

相關文章
相關標籤/搜索