一. 數據類型:
1. undefined: 未聲明和未初始化的變量,typeof 操作符返回的結果都是 undefined;(建議未初始化的變量進行顯式賦值,這樣當 typeof 返回 undefined 時就知道是未聲明了,幫助定位問題)
2. null:建議,將即將保存但還未真正保存對象的變量,賦值為 null;
3. number: 保存浮點數需要的內存空間是保存整數值的兩倍,因此 ECMAScript 會不失時機的將浮點數值轉換為整數值;
4. NaN: isNaN() 用于確定其參數是否“不是數值”;eg: isNaN("blue") —— true (因為不是數值);
附: typeof 可以判斷的類型:undefined/boolean/string/number/function;
5. parseInt(): 第二個參數可以指定進制,使參數按照指定進制轉換,如不指定進制,則按照十進制轉換;
parseFloat() 只解析十進制值,他沒有第二個參數指定基數的用法;
6. 轉換為字符串: toString() 和 String();(null 和 undefined 沒有 toString() 方法)
String() 可將任何類型的值轉換為字符串; 轉換規則如下:
如果值有 toString() 方法,則調用該方法(沒有參數)并返回相應的結果 —— 如果值是 null,則返回 “null” —— 如果值是“undefined”, 則返回“undefined”;
7. 前 ++ 和后 ++:
前++和前--:eg:var age = 28; --age;//28(--age相當于 age = age - 1;age與(--age)整體的值也會變)
后++和后--:eg:
var num1 = 2; var num2 = 20; var num3 = num1-- + num2; //22 (age的值減1,(age--)整體的值不會變) var num4 = num1 + num2; //21
8. 位運算符: 可以提高性能(詳見收藏);
9. == 和 !=: 比較 null 與 undefined 時,不能將它倆轉換為任何值;
10. switch語句:switch語句在比較值時使用的是全等操作符,因此不會發生類型轉換(如,“10” 不等于 10);
?二. 變量、作用域和內存問題:
1. 函數傳參:參數只能按值傳遞:當參數為基本數據類型時,直接進行復制操作;當參數為引用數據類型時,將引用地址進行復制給形參,如果在函數內部重新對引用類型的參數進行賦值,此時修改的引用變量參數為局部變量,這個局部的引用對象會在函數執行完畢后立即被銷毀;(傳參是復制,不能理解為是實參替換形參);函數參數也被當作變量來對待,因此其訪問規則與執行環境中的其他變量相同(局部變量,作用域鏈)。?
?2. 執行環境及作用域:
(1)延長作用域鏈:雖然執行環境的類型總共只有兩種——全局和局部(函數),但還是有其他辦法來延長作用域鏈。這么說是因為有些語句可以在作用域鏈的前端臨時增加一個變量對象,該變量對象會在代碼執行后被移除。在兩種情況下會發生這種現象。具體來說,就是當執行流進入下列任何一個語句時,作用域鏈就會得到加長:try-catch 語句的 catch 塊;with 語句。
這兩個語句都會在作用域鏈的前端添加一個變量對象。對 with 語句來說,會將指定的對象添加到作用域鏈中。對 catch 語句來說,會創建一個新的變量對象,其中包含的是被拋出的錯誤對象的聲明。
(2)垃圾回收機制:
- 標記清除”是目前主流的垃圾收集算法,這種算法的思想是給當前不使用的值加上標記,然后再回收其內存。
- 解除變量的引用不僅有助于消除循環引用現象,而且對垃圾收集也有好處。為了確保有效地回收內存,應該及時解除不再使用的全局對象、全局對象屬性以及循環引用變量的引用。
?