《你不知道的JavaScript》中卷 KYLE SIMPSON 著 单业 姜南 译

一部分  类型和语法

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环境运行)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-09-13 14:04  米牙  阅读(272)  评论(2编辑  收藏  举报