【Eloquent Javascript】學習筆記

[Introduction]

# 編程是爲實現現已有程序無法完成的獨特或開放式的任務,否則要計算直接打開計算器就好

# 編程是構造程序的行爲,而程序就是一系列精準的指令用於告知計算機要做什麼

# 編程從根本上來說是乏味的,但是它提供一個極好的練習培養你的抽象思維能力

# 多數編程通過編程語言來完成,編程語言是人爲構造的語言用於指示計算機

# 計算機本身只能做一些愚蠢而簡單的事情, 它們如此有用的原因是它們以令人難以置信的高速做這些事情

   一個程序可以巧妙地結合大量這些簡單的操作來完成非常複雜的事情

# 爲了編寫早期的計算機程序,必須將大量的開關陣列設置在正確的位置,或者在卡紙條上打孔並將它們輸入計算機

# 編程語言的強大之處在於,它們可以爲我們處理一些無趣的細節

# JavaScript是在1995年引入的一種向web頁面添加程序的方法 (Netscape Navigator瀏覽器)

 

[Values, Types, and Operators]

# 雖然所有值(values)都是由位(bits)組成的,但每個值都類型決定了其扮演的角色,有些值是數字,有些值是文本,有些值是函數等等

# JavaScript使用固定長度的位(bits)數來存儲一個數字(number)類型的值, 即64

# 用小數進行運算通常是不精確的,就像π(pi)不能精確表達的有限數量的小數位數,重要的是明白只能把小數當作近似值,而不是精確的值

# JavaScript中有三個特殊的值,它們被認爲是數字,但其行爲與普通數字不同:正無窮(Infinity), 負無窮(-Infinity)和NaN(not a number)

# 可以使用單引號、雙引號或反引號來標記字符串(strings)

# 並不是所有的操作符(operators)都是算數符號(+, -, *, /), 有些是文字,如 typeof(4.5)  typeof("x")

# 減法操作符(-)既可以是二元操作符也可以用作一元操作符,如 - (10 -2)

# JavaScript中只有一個值不等於它本身,那就是NaN, 它應該表示一個無意義計算的結果,因此,它不等於任何其他無意義計算的結果

   console.log(NaN == NaN)
   // → false

# 操作符中,||的優先級最低,然後是&&,然後是比較操作符(>、==等),然後是其他操作符。選擇這種順序是爲了在典型的表達式中(如下面的表達式),括號越少越好

     1 + 1 == 2 && 10 * 10 > 50

# 有兩個特殊的值,分別爲null和undefined,用於表示沒有意義的值。它們是值但不包含任何信息,這兩個值的差異是語言設計的意外,或者說歷史遺留問題造成,可將他們看作可互換的

# 在類型自動轉換的大多數情況下,JavaScript會嘗試將一個值轉換爲另一個值的類型。但是,當null或undefined出現在操作符的任意一邊時,只有當兩邊都是null或undefined時纔會產生true

  console.log(false == 0)
  // → true

  console.log(null == undefined);
  // → true
  console.log(null == 0);
  // → false

# 邏輯運算符&&和||以一種特殊的方式處理不同類型的值。它們將左邊的值轉換爲布爾類型,以決定要做什麼,但是根據操作符和轉換的結果,它們將返回原始的左值或右值, 這兩個操作符的另一個重要性質是,只有在必要時才計算它們右邊的部分, 這叫做短路評估, 三元運算符工作方式和這個類似,可以看作三元運算的簡寫版

   console.log(null || "user")                                                        console.log(null && "user")
   // → user                                                                                  // → null
   console.log("Agnes" || "user")                                                 console.log("Agnes" && "user")
   // → Agnes                                                                               //→ user

 

[Program Structure]

 產生(value)的代碼片段稱爲表達式(expression)

# 關鍵字let表示這個句子將定義一個綁定(binding)

# 綁定(binding)及其在給定時間存在的值的集合稱爲環境(environment)。當程序啓動時,這個環境不是空的。它總是包含綁定,這些綁定是語言標準的一部分,而且大多數時候,它還提供了與周圍系統交互的方法。例如,在瀏覽器中,有與當前加載的網站交互的功能,以及讀取鼠標和鍵盤輸入的功能

循環控制流允許我們回到程序中之前所在的某個位置,並以當前程序狀態重複它

[Functions]

# 函數(functions)中沒有return或return沒有返回任何值的時候都將會返回undefined

# 函數參數或在函數體中聲明的bindings屬於局部(local) bindings,每次調用函數時,都會創建這些bindings的新實例。這在函數之間提供了一些隔離—每個函數調用都在其自己的小世界(其本地環境)中運行,並且常常可以在不瞭解全局環境中發生的事情的情況下被理解

# let和const聲明的bindings會創建作用域(scopes), 範圍是它們聲明時所在的(blocks),在es6之前,只有函數能生成新作用域

# 每個局部作用域還可以看到包含它的所有局部作用域,而所有作用域都可以看到全局作用域。這種bindings可見性(visibility)的方法稱爲詞法作用域(lexical scoping)

# 創建函數可以使用

      * 聲明bindings的形式,函數表達式,可選箭頭(arrow)函數

      * 還可以使用函數聲明(function declaration)的形式, 會定義bindings並指向該函數, 不同於普通的由上而下的控制流,它們會自動被移到其作用域的頂部然後可以被該作用域中的所有代碼使用

# JavaScript對於傳遞給函數的參數的數量非常寬容, 如果傳遞太多,多餘的將被忽略。如果傳遞的參數太少,則丟失的參數將被賦給undefined

#  A function that references bindings from local scopes around it is called a closure

[Data Structures: Objects and Arrays]

# Object和Stack等都是數據結構(Data Structures), 數字、布爾值和字符串是構成數據結構的原子

    * A Object (對象) 是屬性的任意集合的數據結構

    * A Stack() 是一種數據結構,允許您將值推入其中,然後按相反的順序再次彈出它們,以便最先刪除最後添加的內容

# 數組(Array)只是一種專門用於存儲事物序列的對象(是一種特殊類型的Object)

# for( of ) 不僅適用於數組,也適用於字符串和其他一些數據結構

# 類型爲string、number和Boolean的值不是對象,這些值是不可變的,不能更改 ( 猜測應該是數據結構)

# 因爲屬性(properties)只指向它們的值,而不包含它,所以對象和數組作爲包含其內容的地址(即內存中的位置)的位序列存儲在計算機的內存中,如果您希望將數據保存在一個文件中,以便以後使用或通過網絡將其發送到另一臺計算機,則必須以某種方式將這些混亂的內存地址轉換爲可存儲或發送的描述,我們能做的就是序列化(serialize)數據。這意味着它被轉換成平面描述。一種流行的序列化格式稱爲JSON

[Higher-Order Functions]

# 對其他函數進行操作的函數(通過接受它們作爲參數或返回它們)稱爲高階函數

[The Secret Life of Objects]

# 將接口與實現分離是個好主意。它通常被稱爲封裝(encapsulation)

# 可以將this視爲以不同方式傳遞的額外參數。如果您想顯式地傳遞它,您可以使用函數的call方法

# 每個函數都有自己的this綁定,其值取決於調用它的方式; 箭頭函數是不同的-他們不綁定自己的this,但可以在他們周圍的作用域(scope)看到這個綁定(bindings)

# 許多對象 (Objects)的原型並不是Object.prototype, 而是另外提供不同默認屬性集合的對象,比如 Function的原型是Function.prototype, 但這些原型還是間接的繼承了Object.prototype

 

 

 

 

 

[Drawing on canvas]
# 瀏覽器顯示圖形的方式:
  * css - 使用style定位上色甚至變形(transform)普通的DOM元素,最簡單的方式
  * svg - 關注形狀而不是文本的文檔標記方言(ie9及以上)
       > The xmlns attribute is only required on the outermost svg element of SVG documents. It is unnecessary for inner svg elements or inside HTML  documents.
  * canvas - 封裝圖形的DOM元素

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章