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()方法提取一个对象中的方法