1.javascript中,值包括原始值和對象,原始值包括布爾值、數字、字符串、null和undefined,其餘的值爲對象。javascript
原始值的特色:(1)按值進行比較:3===3> true; 'abc'==='abc'> true java
(2)屬性不能改變、添加和移除 var src='abc'; str.length=1; str.length> 3 str.foo=3; str.foo> undefined正則表達式
對象:包括簡單對象、數組、正則表達式,特色:(1)按引用進行比較 {}==={}> false var obj1={}; var obj2=obj1; obj1===obj2> true數組
(2)屬性能夠自由被改變、添加和移除 var obj={}; obj.foo=123; obj.foo> 123閉包
2. undefined:沒有值,未被初始化的變量即爲undefined,丟失的參數,訪問不存在的屬性ide
null:沒有對象,表示空值函數
undefined和null沒有屬性,也沒有方法, 可被看作falsespa
3. 對值分類:typeof和instanceofcode
typeof主要用於原始值,instanceof主要用於對象對象
typeof undefined> 'undefined' typeof null> object ,可是null不是一個對象
null instanceof object> false undefined insteanceoof object> false
4. 被解釋爲false的值:undefined、null、false、0、NaN、'' ,其餘值被解釋爲true
5. &&:能夠返回布爾值,也可爲其餘值,若是第一個運算數是假的,返回它,不然返回第二個運算數 NaN&&'abc'> NaN 123&&'abc'> 'abc'
||: 能夠返回布爾值,也可爲其餘值,若是第一個運算數是真的,返回它,不然返回第二個運算數 'abc'||123> 'abc' ''||123> 123
6. 全部的數字都是浮點數 1===1.0> true, 還有特殊的數字:NaN,Infinity, Infinity比任何數字大(除了NaN),-Infinity比任何數小(除了NaN)
7. 函數聲明具備提高特性—它們的實體會被移動到所在做用域的開始處。這使得咱們能夠引用後面聲明的函數。
function foo(){ bar(); //Ok function bar(){ } }
注意,var 聲明賦值不具有該特性,
function foo(){ bar(); //Not OK var bar=function(){ } }
8. 函數內的arguments不是數組,只是相似數組,有length屬性,能夠經過[]訪問每一個參數,可是不能對它調用數組的方法, 能夠經過toArray()方法將它變爲數組
9. 一個變量的做用域老是完整的函數:
1 function foo(){ 2 var x=-1; 3 if(x<0) 4 { 5 var tmp=-x; 6 } 7 console.log(tmp); // 1 8 }
10. 全部的變量聲明都會被提高,聲明會被移動到函數的開始處,而賦值還在原來的位置進行
function foo(){ console.log(tmp);// undefined if(false) { var tmp=3; } }
11. 閉包:每一個函數和它周圍的變量保持着鏈接,哪怕離開被建立時的做用域也是如此。函數以及它所鏈接的周圍做用域中的變量即爲閉包。
function foo(s){ return function(){ s++; return s; } } var inc=foo(5); inc();// 6 inc();//7 inc();//8
12. IIFE模式(當即調用表達式):引入新的做用域 , 防止一個變量變成全局變量
(function(){ //開啓IIFE var tmp=...;// 非全局變量 }());
用例:解決閉包形成的無心共享
result=[]; for(var i=0;i<5;i++) { (function(){ var i2=i; //複製i result.push(function(){ return i2}); }();) } console.log(result[1]());//1 console.log(result[3]());//3
13. 兩種面向對象機制:單一對象和構造函數
對象能夠認爲是一組屬性的集合,使用in 運算符檢查屬性是否存在,使用delete運算符移除屬性
任意屬性名:使用引號括起來,用方括號獲取和設置
var obj={'not a identifier': 123}; >obj['not a identifier'] 123 >obj['not a identifier']=456; //方括號能夠動態計算 >obj['not a'+'identifier'] 123
14. var func2=obj.func.bind(obj); //使用bind()方法提取一個對象中的方法