一部分 类型和语法
1.内置类型(7)
null、undefined、boolean、number、string、object、symbol(ES6新增,符号)
2.toString()和Json.stringify()
(1)字符串、数字、布尔值和null的JSON.stringify()规则与toString基本相同
(2)如果传递给JSON.stringify()对象中定义了toJSON()方法,那么该方法会在字符串化前调用,以便将对象转换为安全的JSON值。
3.a+''会对a调用valueOf()方法,String(a)则是调用toString()方法。
4.'44'==true; //false 原因把bool转换为number,'44'==true ==> '44'==1 ==> 44==1; //false
5.""==0;//true ""==[];//true 0==[];//true
注:(1)如果两边的值中有true或false(2)如果两边的值中有[] "" 或者 0,尽量不要使用==,可用===来避免不经意的强制类型转换。
6.var a={b:42}; var b={b:43};
a<b;//false a==b;//false a>b;//false a>=b;//true a<=b;//true
a.b被转化为[object object], a>=b ==> !(a<b) ==> true
7.var a=42; a++;//42 a;//43 ++a;//44 a;//44
8.运算符优先级 : && > || > ?:
9.左关联: && ||
10.右关联: ?: =
eg1(三目运算): true?false:true?true:true;// false true?false:(true?true:true);//false (true?false:true)?true:true;// true //说明三目运算是右关联
eg2(赋值): var a,b,c; a=b=c=42; //首先执行c=42,然后b=...,最后a=...;
二次阅读:
第一部分:类型和语法
第一章:类型
1.JavaScript的七种内置类型:null/undefined/string/number/boolean/object/symbol(es6新增)
(除对象为基本类型)
2.typeof可检测:undefined/string/number/boolean/stymbol
3.null 检测:var a=null ; !a && typeof a ==‘object’
4.function是object的‘子类型’
第二章。值
1.类数组转化为数组:var arr=Array.prototype.slice.call(arguments);或 var arr=Array.from(arguments);
2. 0.1+0.2;//0.30000000000000004 .1+.2===.3;//false
判断方法,设置一个误差范围值:机器精度2^-52 Math.EPSILON. Math.abs(.1+.2-.3)<Number.EPSILON;//true
3.void 返回值是undefined
4.NaN说js中唯一一个不等于自身的值:
if(!Number.NaN){
Number.NaN=function(n){
return n!=n;
}
}
5.Object.is(NaN,NaN);//true. Object.is(0,-0);//false. 注:能用==或===就别用Object.is(其效率不高)
第三章。原生函数
1.常用原生函数(内建函数):String()/Number()/Boolean()/Object()/Array()/Function()/RegExp()/Date()/Error()/Symbol()(es6新加)
注:Date要带New关键词,Symbol不带new关键词,其他可不带new关键词
2.Object.protyotype.toString.call()比typeof管用还可以判断null/Undefined,eg:Object.prototype.toString.call(null);//"[object Null]"
第四章 强制类型转换
1.关于JSON:(1)undefined/function/symbol和包含循环引用(对象间相互引用形成无限循环)的对象都不符合JSON结构标准
(2)JSON.stringify(…)在对象中遇到undefined/function/symbol会自动将其忽略;在数组中会返回null(以保证单元位置不变)。
2.toJSON()返回一个能够被字符串话的安全的JSON值,而不是JSON字符串。
3.转化为Boolean(或!!):假值:undefined/null/false/+0/-0/NaN/‘’,除此之外都为true
4.+的隐士转换:eg:(1). +’3’;//3. 1 +’3’;//4. (2). +new Date();//时间搓。 es5:Date.now();//当前时间戳
5.~x等同于-(x+1); eg:var a=‘hello’; ~a.indexOf(’00’);//-0(即为false,其他为true可用判断)
6.var a=’42px’; Number(a);//NaN. parseInt(a);//42
7.parseInt()的第二个参数是进制,eg:parseInt(55,10)
8.var a=[3],b=[2]; a-b;//1 -运算类似于+。 字符串转为数字
9.符号不能被强制转化数字(隐式显式都不行),但可以转化为布尔(隐式显式都可以)。eg:var a=Symbol; a+’’;//报错
10:==允许在相等比较中进行强制类型转化,而===不允许。
11.null==undefined;//true. 除此之外Null.undefined他们自身相等。 null==false;//false. undefined==false;//false
12.var a={b:42};var b={b:43}; a<b;//false. a>b;//false. a==b;//false a<=b;//true. a>=b;//true. 比较时a/b转化’[object object]’
第五章。语法
1.var a,b; a=do{b=4+38}; a;//42
2.var a=42; ++a;//43. ++43//报错referenceError. ++a++;//报错referenceError
3.运算符执行顺序:(1)&& > || > ?: > , (2)左关联:&&/|| 右关联:?:/=
4.函数参数:如果参数被省略或者值为undefined,则取该参数的默认值
5.try..finally:执行try后执行finally(无论如何都会执行finally);finally中有return值会覆盖try中return值。
6.switch…case中:case可以是表达式:switch(true){case a==10;console.log(10);break; …}
第二部分。异步和性能
第一章 异步:现在与将来
第三章:promise
1.try…catch:无法跨异步操作工作(及try里进行异步/回掉处理报错无法catch,只能硬生生报错)
2.promise.all([…])仅在所有成员的promise都完成才返回完成,其中任意一个被拒绝即被拒绝,并丢弃来自其他所有promise的全部结果
注:(1)Promise.all([…])数组为空立即完成;Promise.race([…])数组为空,永不决议,不为空:一旦有任何一个promise完成则为完成,一旦任意一个为拒绝则为拒绝
(2)Promise.all([p1,p2]).then(function(msgs){. //msgs是一个数组 })。 Promise.race([p1,p2]).then(function(msg){. //msg只返回最先执行完的回执 })
3.归纳:
(1)var p=new Promise(function(resolve,reject){ })
(2)Promise.resolve(…)和Promise.reject(…)
(3)then().catch(). p.catch(reject)与p.then(null,reject);一样
(4)Promise.all([…])和Promise.race([…])
Q1:Function.apply.bind(fn,null);224
Q2:
第四章。生成器
第五章。程序性能
第六章。性能测试与调优
1.可用Benchamark.js测试(可在js,node.js环境运行)