Javascript知識整理

來源:互聯網
上載者:User

標籤:

 

一、類型和變數

 

1. js中資料類型分為兩類:原始類型和物件類型。原始類型包括數字、字串和布爾值

2. 對象是屬性的集合,每個屬性都由索引值對構成。

3. 字串是由字元組成的數組,它是不可變的

4. 在任何使用二進位浮點數的程式設計語言,都會遇到浮點精度問題。使用大整數進行重要計算可以減小誤差(更細小的單位)

5. 兩個date對象可以進行加減法以計算時間

6. 數字和字串並不是對象,但他們擁有方法。原因是當調用他們的方法時,會自動執行 new String/Number來產生一個臨時對象。當引用結束,臨時對象將被銷毀

7. 如果想進行對象/數組複製,必須顯式複製對象的每個屬性或數組的每個元素。同樣的如果要比較兩個單獨的對象或數組,也需要如此

8. js中沒有塊級範圍(直到ES 5),只有函數範圍和全域範圍

9. 在函數中,變數的聲明會被提前至函數頂部,但初始化仍在原來的位置。這被稱為“聲明提前”

10. 當聲明全域變數時,其實是定義了全域對象的一個屬性,所以可以使用delete刪除它們

11. 當定義一個函數時,其實儲存了一個範圍鏈。當調用這個函數時,它建立一個新的對象來儲存它的局部變數,並將這個對象添加到儲存的那個範圍鏈上。同事建立一個新的更長的表示函數調用範圍的“鏈”

 

二、運算式和運算子

 

1. 嚴格相等運算子 “===” 首先計算其運算元的值,比較過程沒有任何類型轉換

2. NaN與任何指都是不相等的,包括它自身

3. instanceof操作符希望左側是一個對象,右側是標識對象的類。如果左側對象是右側類的執行個體,則返回true

4. eval() 只有一個參數,如果傳入的參數不是字串,它直接返回這個參數,如果參數是字串,它會把字串當成js代碼進行編譯。如果編譯成功,則開始執行這段代碼,並返回字串中最後一個運算式或語句的值

5. typeof放在單個運算元的前面,運算元可以是任意類型。返回表示運算元類型的一個字串

6. delete是一元操作符,用來刪除對象的屬性或數組的元素

 

三、語句

 

1. 使用var name = function 和 直接使用function 聲明的函數有一點區別,使用函式宣告語句定義的函數會被提前,無論函數定義還是函數體,它對整個範圍都是可見的。而使用函數定義運算式聲明的函數則只有聲明被提前(與var聲明變數一致)

2. switch後面的expression判斷是使用 “===” 進行比較的

3. 拋出異常時,Javascript解譯器會立即停止當前正在執行的邏輯,並跳轉到就近的例外處理常式。如果拋出異常的函數沒有例外處理常式,異常會沿著Javascript方法的詞法結構和調用棧向上傳播。如果沒有找到任何例外處理常式,Javascript將把異常當做錯誤來處理,並報告給使用者。

4. with對象是用來擴充範圍鏈,絕大多數情況下都不應該使用

 

四、對象

 

1. 除了字串、數字、true、false、null和undefined之外,Javascript中的所有值都是對象

2. 除了名字和值之外,每個屬性還有一些與之相關的值。成為“屬性特性”

3. 可以通過直接量、關鍵字new和Object.create() 函數來建立對象

4. Object.create() 是一個靜態函數,使用它的方法是傳入所需的原型對象

  var child = Object.create(father)

5. 可以通過Object.create(null) 來建立一個沒有原型的新對象,但通過這種方式建立的對象沒有繼承任何基礎方法,例如toString()。也就是說它不能和 “+” 運算子一起正常工作

6. 如果想建立一個普通的Null 物件,可以使用{} 或 new Object() 或 Object.create(Object.prototype)

7. 可以通過對象直接讀取原型中的屬性,但給這個屬性賦值並不會影響原型中的值 

8. delete運算子只能刪除自有屬性,不能刪除繼承屬性

9. 可以使用對象的hasOwnProperty() 方法來檢測給定的名字是否是對象的自有屬性,對於繼承屬性它將返回false

10. propertyIsEnumerable() 是hasOwnProperty()的增強版,只有檢測到自有屬性,並且這個屬性可枚舉時才會返回true

11. 每個對象都有原型、類和可擴充性

12. ES 5提供了內建函數JSON.stringify() 和JSON.parse() 用來序列化和還原Javascript對象

 

五、數組

 

1. Javascript數組是無類型的,數組元素可以是任意類型,並不一定是常亮,也可以是變數

2. Javascript數組是動態,根據需要他們會增長或縮減

3. Javascript數組可能是稀疏的,數組元素的索引不一定是連續的,他們之間可以有空缺

4. 足夠稀疏的數組通常在實現上比稠密的數組更慢、記憶體利用率更高,在這樣的數組中尋找元素的時間與常規對象屬性的尋找時間一樣長

5. 數組的length屬性有三個特殊行為:

  1. 如果為一個數組元素賦值,它的索引超出或等於當前長度時,length自動變為 n + 1
  2. 當length被賦值小於當前數組長度時,數組會被截取
  3. 當length被賦值大於當前數組長度時,數組不會預設添加新的元素,只是在尾部留出一段空白地區

6. Array.push() 方法向數組末尾添加一個元素,使用Array.pop() 可以刪除末尾的一個元素,數組索引會自動維護

7. Array.unshift() 方法向數組頂部添加一個元素,使用Array.shift() 可以刪掉數組的第一個元素,數組索引會自動維護

8. Array.json() 方法,用於將數組中的所有元素轉為字串並連在一起,預設使用 “,” 串連。也可以傳入串連符。

9. Array.reverse() 方法將數組中的元素顛倒順序,返回逆向的數組。它採用替換,原數組將被改變

10. Array.sort() 方法將數組中的元素排序並返回排序後的數組,當不帶參數調用sort() 時,數組元素以字母表順序排序

11. Array.concat() 方法建立並返回一個新數組,它的元素包括調用concat() 的原始數組,和concat() 的每個參數

  var a = [1, 2, 3]

  a.concat(5, 6)  // a = [1, 2, 3, 5, 6]

12. Array.slice() 方法返回數組的一個片段,它返回索引從第一個數字到但不包含第二個數位數組

13. Array.splice() 的前兩個參數指定了需要刪除的數組元素,從第三個參數開始,將依次插入以參數1為索引的位置

  var a  = [1, 2, 3]

  a.splice(1, 0, ‘a‘, ‘b‘, ‘c‘)  // a = [1, 2, ‘a‘, ‘b‘, ‘c‘, 3]

14. ES 5中可以使用Array.isArray() 函數來判斷該對象是否為數組。ES 3中的 isArray() 函數的代碼如下:

1 var isArray = Function.isArray || function(o) {2     return typeof o === ‘object‘ &&3     Object.prototype.toString.call(o) === ‘[object Array]‘4 }

 

 

五、函數

 

1. 當方法不需要傳回值時,最好就是返回它本身(this),這樣就可以進行 “鏈式調用”

2. 在調用函數時,如果傳入的實參比函式宣告時所指定的形參要少,則預設的形參將被賦值為undefined

3. 函數對象可以通過範圍鏈聯絡起來,函數體內部的變數都可以儲存在函數範圍內,這種特性在電腦科學文獻中被稱為“閉包”

4. 從技術的角度講,所有的Javascript函數都是閉包,他們都是對象,他們都關聯到範圍鏈

5. 如果函數定義了嵌套的函數,並將它作為傳回值返回或儲存在某處的屬性裡,這時就會有一個外部參考指向這個嵌套的函數。他不會被當做記憶體回收,並且它所指向的變數綁定對象也不會被當做記憶體回收

6. 函數體內的arguments.length表示傳入函數的實參的個數,函數對象本身的length屬性則表示形參的個數

7. call() 和 apply() 都用來調用方法,第一個參數都是this,區別在於第二個參數,apply傳入的是數組,而call則直接傳入參數列表。

  以對象o的方法形式調用函數f(),可以寫成這樣:

  f.call(o, 1, 2)

  f.apply(o, [1, 2])

8.ES 5 中的bind() 方法可以將函數綁定至某個對象,在ES 3中可以輕鬆類比:

  

 1 function bind(f, o) { 2     if (f.bind) { 3  4         return f.bind(o) 5  6     } else { 7  8         return function() { 9 10             return f.apply(o, arguments)11         }12     }13 }

 

Javascript知識整理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.