標籤:
一、類型和變數
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屬性有三個特殊行為:
- 如果為一個數組元素賦值,它的索引超出或等於當前長度時,length自動變為 n + 1
- 當length被賦值小於當前數組長度時,數組會被截取
- 當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知識整理