javascript
《你不知道的JavaScript》中卷 KYLE SIMPSON 著 单业 姜南 译
一部分? 類型和語(yǔ)法
1.內(nèi)置類型(7)
null、undefined、boolean、number、string、object、symbol(ES6新增,符號(hào))
2.toString()和Json.stringify()
(1)字符串、數(shù)字、布爾值和null的JSON.stringify()規(guī)則與toString基本相同
(2)如果傳遞給JSON.stringify()對(duì)象中定義了toJSON()方法,那么該方法會(huì)在字符串化前調(diào)用,以便將對(duì)象轉(zhuǎn)換為安全的JSON值。
3.a+''會(huì)對(duì)a調(diào)用valueOf()方法,String(a)則是調(diào)用toString()方法。
4.'44'==true;? ?//false? 原因把bool轉(zhuǎn)換為number,'44'==true? ? ==>? ? '44'==1? ?==>? ?44==1;???//false
5.""==0;//true? ? ? ""==[];//true? ? ?0==[];//true
注:(1)如果兩邊的值中有true或false(2)如果兩邊的值中有[]? ?""? 或者? 0,盡量不要使用==,可用===來(lái)避免不經(jīng)意的強(qiáng)制類型轉(zhuǎn)換。
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被轉(zhuǎn)化為[object? object],? ? ? ? ? a>=b? ==>? !(a<b)? ? ==>? true
7.var a=42;? ? a++;//42? a;//43? ?++a;//44? ?a;//44
8.運(yùn)算符優(yōu)先級(jí) :? && > || > ?:
9.左關(guān)聯(lián):? &&? ||
10.右關(guān)聯(lián): ?:? ? =??
eg1(三目運(yùn)算):? true?false:true?true:true;// false? ? ? ??true?false:(true?true:true);//false? ??(true?false:true)?true:true;// true? ? ? //說(shuō)明三目運(yùn)算是右關(guān)聯(lián)
eg2(賦值): var a,b,c;? ? a=b=c=42;? ?//首先執(zhí)行c=42,然后b=...,最后a=...;
?
二次閱讀:
第一部分:類型和語(yǔ)法
第一章:類型
1.JavaScript的七種內(nèi)置類型:null/undefined/string/number/boolean/object/symbol(es6新增)
(除對(duì)象為基本類型)
2.typeof可檢測(cè):undefined/string/number/boolean/stymbol
3.null 檢測(cè):var a=null ; ? !a && typeof a ==‘object’
4.function是object的‘子類型’
?
?
第二章。值
1.類數(shù)組轉(zhuǎn)化為數(shù)組:var arr=Array.prototype.slice.call(arguments);或 var arr=Array.from(arguments);
2. ? 0.1+0.2;//0.30000000000000004 ? .1+.2===.3;//false
?? ? 判斷方法,設(shè)置一個(gè)誤差范圍值:機(jī)器精度2^-52 Math.EPSILON.? ? Math.abs(.1+.2-.3)<Number.EPSILON;//true
3.void 返回值是undefined
4.NaN說(shuō)js中唯一一個(gè)不等于自身的值:
if(!Number.NaN){
Number.NaN=function(n){
return n!=n;
}
}
5.Object.is(NaN,NaN);//true. Object.is(0,-0);//false. ? ? 注:能用==或===就別用Object.is(其效率不高)
?
?
第三章。原生函數(shù)
1.常用原生函數(shù)(內(nèi)建函數(shù)):String()/Number()/Boolean()/Object()/Array()/Function()/RegExp()/Date()/Error()/Symbol()(es6新加)
? 注:Date要帶New關(guān)鍵詞,Symbol不帶new關(guān)鍵詞,其他可不帶new關(guān)鍵詞
2.Object.protyotype.toString.call()比typeof管用還可以判斷null/Undefined,eg:Object.prototype.toString.call(null);//"[object Null]"
?
?
第四章? 強(qiáng)制類型轉(zhuǎn)換
1.關(guān)于JSON:(1)undefined/function/symbol和包含循環(huán)引用(對(duì)象間相互引用形成無(wú)限循環(huán))的對(duì)象都不符合JSON結(jié)構(gòu)標(biāo)準(zhǔn)
(2)JSON.stringify(…)在對(duì)象中遇到undefined/function/symbol會(huì)自動(dòng)將其忽略;在數(shù)組中會(huì)返回null(以保證單元位置不變)。
2.toJSON()返回一個(gè)能夠被字符串話的安全的JSON值,而不是JSON字符串。
3.轉(zhuǎn)化為Boolean(或!!):假值:undefined/null/false/+0/-0/NaN/‘’,除此之外都為true
4.+的隱士轉(zhuǎn)換:eg:(1).? ? +’3’;//3.? ? 1 +’3’;//4.? ? (2). ? +new Date();//時(shí)間搓。 ? es5:Date.now();//當(dāng)前時(shí)間戳
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()的第二個(gè)參數(shù)是進(jìn)制,eg:parseInt(55,10)
8.var a=[3],b=[2];? a-b;//1? ? -運(yùn)算類似于+。 字符串轉(zhuǎn)為數(shù)字
9.符號(hào)不能被強(qiáng)制轉(zhuǎn)化數(shù)字(隱式顯式都不行),但可以轉(zhuǎn)化為布爾(隱式顯式都可以)。eg:var a=Symbol;? a+’’;//報(bào)錯(cuò)
10:==允許在相等比較中進(jìn)行強(qiáng)制類型轉(zhuǎn)化,而===不允許。
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.? ? 比較時(shí)a/b轉(zhuǎn)化’[object object]’
?
?
第五章。語(yǔ)法
1.var a,b;? ? a=do{b=4+38};? ? a;//42
2.var a=42;? ++a;//43. ++43//報(bào)錯(cuò)referenceError.? ++a++;//報(bào)錯(cuò)referenceError
3.運(yùn)算符執(zhí)行順序:(1)&& > || > ?: > , (2)左關(guān)聯(lián):&&/|| ? 右關(guān)聯(lián):?:/=
4.函數(shù)參數(shù):如果參數(shù)被省略或者值為undefined,則取該參數(shù)的默認(rèn)值
5.try..finally:執(zhí)行try后執(zhí)行finally(無(wú)論如何都會(huì)執(zhí)行finally);finally中有return值會(huì)覆蓋try中return值。
6.switch…case中:case可以是表達(dá)式:switch(true){case a==10;console.log(10);break; …}
?
第二部分。異步和性能
第一章? 異步:現(xiàn)在與將來(lái)
第三章:promise
1.try…catch:無(wú)法跨異步操作工作(及try里進(jìn)行異步/回掉處理報(bào)錯(cuò)無(wú)法catch,只能硬生生報(bào)錯(cuò))?
2.promise.all([…])僅在所有成員的promise都完成才返回完成,其中任意一個(gè)被拒絕即被拒絕,并丟棄來(lái)自其他所有promise的全部結(jié)果
注:(1)Promise.all([…])數(shù)組為空立即完成;Promise.race([…])數(shù)組為空,永不決議,不為空:一旦有任何一個(gè)promise完成則為完成,一旦任意一個(gè)為拒絕則為拒絕
? ? ? (2)Promise.all([p1,p2]).then(function(msgs){. //msgs是一個(gè)數(shù)組 ? })。 Promise.race([p1,p2]).then(function(msg){. //msg只返回最先執(zhí)行完的回執(zhí) ? })
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:
?
第四章。生成器
?
第五章。程序性能
?第六章。性能測(cè)試與調(diào)優(yōu)
1.可用Benchamark.js測(cè)試(可在js,node.js環(huán)境運(yùn)行)
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/miaSlady/p/9640158.html
總結(jié)
以上是生活随笔為你收集整理的《你不知道的JavaScript》中卷 KYLE SIMPSON 著 单业 姜南 译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于java的智能手表_基于安卓Andr
- 下一篇: JS打开新窗口的2种方式