一恩沛、let和const
1. let,const不存在變量提升,只在聲明所在的塊級作用域中有效。
2. Es5只有全局作用域和函數(shù)作用域,Es6添加了塊級作用域秧饮。
3. 考慮到環(huán)境導(dǎo)致的行為差異太大,應(yīng)該避免在塊級作用域內(nèi)聲明函數(shù)。如果確實需要柴灯,也應(yīng)該寫成函數(shù)表達(dá)式卖漫,而不是函數(shù)聲明語句。
4. 對于復(fù)合類型的變量赠群,變量指向數(shù)據(jù)所在的地址羊始,不保證該地址的數(shù)據(jù)不變,所以在將對象聲明為常量時必須特別小心查描。
5.let, const, class定義的全局變量與頂層對象脫鉤
二突委、變量的解析賦值
1. 對象的解析賦值的內(nèi)部機(jī)制,是先找到同名屬性冬三,然后再賦給對應(yīng)的變量匀油。真正被賦值的是后者,而不是前者勾笆。如:
2. 解析也可用于嵌套結(jié)構(gòu)的對象敌蚜,如
3. 對象的解析賦值,可以很方便的將現(xiàn)有對象的方法窝爪,賦值到某個變量弛车,如
4. 圓括號問題,解析賦值解析圓括號時很麻煩蒲每,只要由可能纷跛,就不要在模式中放置圓括號。另外:
* 變量聲明語句中邀杏,不能帶有圓括號
* 函數(shù)參數(shù)中忽舟,模式不能帶有圓括號
* 賦值語句中,不能將整個模式淮阐,或嵌套模式中的一層叮阅,放在圓括號中
三、字符串的擴(kuò)展
1. JS內(nèi)部泣特,字符以UTF-16的格式存儲浩姥,每個字符固定為2個字節(jié)。對于那些需要4個字節(jié)存儲的字符(Unicode碼大于0xFFFF的字符)状您,JS會認(rèn)為它們是兩個字符勒叠。
2. Es6提供的codePointAt方法,直接使用時參數(shù)也不能正確識別膏孟,如下面的字符串中眯分,a的位置應(yīng)該是1,但必須傳入2才能取到字符柒桑,解決的辦法是使用for...of循環(huán)弊决,它能正確識別32位的UTF-16字符。
3. Es6中提供了另外操作32位的UTF-16的函數(shù):String.fromCodePoint(), at(), includes(), startsWith(), endsWith()如
4.模板字符串
四、數(shù)值
1. 二進(jìn)制和八進(jìn)制的表示法分別使用前綴0b/0B和0o/0O飘诗。
2. 新的函數(shù)Number.isFinite(), Number.isNaN(), Number.parstInt(), Number.parseFloat(), Number.isInteger(),
在JS內(nèi)部与倡,整數(shù)和浮點數(shù)是同樣的存儲方法,所以3和3.0被視為同一個值昆稿。
3. 安全整數(shù)檢測Number.isSafeInteger(), Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER纺座。
在使用Number.isSafeInteger()時,不能只驗證運算結(jié)果溉潭,而要同時驗證參與運算的每個值净响。
4. ES6在Math對象上新增了17個與數(shù)學(xué)相關(guān)的方法。
五喳瓣、數(shù)組
1. Array.from()用于將類似數(shù)組的對象(含有l(wèi)ength屬性)和可遍歷的對象(包括ES6新增的數(shù)據(jù)結(jié)構(gòu)Set和Map)轉(zhuǎn)換為數(shù)組
2. Array.of()用來將一組值轉(zhuǎn)換為數(shù)組馋贤,主要目的是彌補(bǔ)Array()和new Array()由于參數(shù)的不同導(dǎo)致的行為的差異,如
3. 數(shù)組實例的copyWithin()夫椭,在當(dāng)前數(shù)組內(nèi)部掸掸,將指定位置的成員復(fù)制到其他位置(會覆蓋原有成員)。
4. 數(shù)組實例的find()和findIndex()函數(shù)
5. 數(shù)組實例的includes()函數(shù)
同Set結(jié)構(gòu)的has()方法一樣蹭秋,數(shù)組的includes()函數(shù)是用來查找值的扰付;而Map結(jié)構(gòu)的has()方法是用來查找鍵名的。
6.由于空位的處理規(guī)則非常不統(tǒng)一仁讨,所以要避免出現(xiàn)空位的情況羽莺。
六、函數(shù)
1. 函數(shù)默認(rèn)值
2. 函數(shù)的length屬性洞豁,表示該函數(shù)預(yù)期傳入的參數(shù)個數(shù)盐固。如果參數(shù)有默認(rèn)值,則length不包含這個參數(shù)丈挟。同理刁卜,rest參數(shù)也不會計入length屬性
3. 如果將參數(shù)默認(rèn)值設(shè)為undefined,表明這個參數(shù)是可以省略的曙咽。
functionfoo(bar = undefined){......}
4. rest參數(shù)蛔趴,形式為“...變量名“,用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對象了例朱。
5. 擴(kuò)展運算符“...” 孝情,它的作用是將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列。
擴(kuò)展運算符內(nèi)部調(diào)用的是數(shù)據(jù)結(jié)構(gòu)的Iterator借口洒嗤,因此只要具有Iterator接口的對象箫荡,都可以使用擴(kuò)展運算符,比如Map結(jié)構(gòu)渔隶。
6. 箭頭函數(shù)
如果沒有參數(shù)羔挡,或多個參數(shù),就使用一個圓括號代表參數(shù)部分
感覺添加一個小括號比較好,這樣可以統(tǒng)一起來
7.箭頭函數(shù)中的this婉弹,指向固定化睬魂,并不是因為箭頭函數(shù)內(nèi)部有綁定this的機(jī)制终吼,實際原因是箭頭函數(shù)根本沒有自己的this镀赌,導(dǎo)致內(nèi)部的this就是外層代碼塊的this。
上面的代碼中际跪,只有一個this商佛,就是函數(shù)foo的this,所以t1,t2,t3輸出同樣的結(jié)果姆打,因為內(nèi)部所以的箭頭函數(shù)都沒有自己的this良姆,他們的this實際都是最外層foo函數(shù)的this。
長期以來幔戏,Js的this對象一直都是一個令人頭疼的問題玛追,在對象方法中使用this,必須非常小心闲延,箭頭函數(shù)“綁定”this痊剖,很大程度上解決了這個困擾。
7.尾調(diào)用優(yōu)化和尾遞歸
七垒玲、對象,允許使用變量和函數(shù)陆馁,作為對象的屬性和方法
1.簡潔表示法
2.判斷兩個值是否相等使用Object.is()
3.Object.assign()方法用于對象的合并,將源對象source的所有可枚舉屬性合愈,復(fù)制到目標(biāo)對象target叮贩。
如果目標(biāo)對象與源對象有同名屬性,或多個源對象有同名屬性佛析,則后面的屬性會覆蓋前面的屬性
Object.assign方法是淺拷貝益老,如果源對象某個屬性的值是對象,則目標(biāo)對象拷貝得到的是這個對象的引用寸莫。
Object.assign()的用途
為對象添加屬性
為對象添加方法
克隆對象
合并多個對象
為屬性指定默認(rèn)值
4.遍歷對象 Object.keys, Object.values, Object.entries
5.擴(kuò)展運算符
八捺萌、Set和Map
1. Set類似于數(shù)組,但它的成員值都是唯一的储狭。
* keys():返回鍵名的遍歷器* values():返回鍵值的遍歷器* entries():返回鍵值對的遍歷器* forEach():使用回調(diào)函數(shù)遍歷每個成員> 擴(kuò)展運算符...內(nèi)部使用for...of循環(huán)互婿,所以也可以用于Set結(jié)構(gòu)
九、一些不常用的功能
1. SIMD(Single Instruction/Multiple Data)辽狈,即單指令慈参,多數(shù)據(jù)
它是JS操作CPU對應(yīng)指令的接口,可以使用一個指令刮萌,完成多個數(shù)據(jù)的運算驮配,所以被廣泛用于3D圖形運算、物理模擬等運算量超大的項目之中。
SIMD是數(shù)據(jù)并行處理(parallelism)的一種手段壮锻,可以加速一些運算密集型操作的速度琐旁。
十、編程風(fēng)格
1. let和const
let取代var
所有的函數(shù)都應(yīng)該設(shè)置為常量
長遠(yuǎn)來看猜绣,JS可能會有多線程的實現(xiàn)灰殴,let表示的變量,這時let表示的變量掰邢,只應(yīng)出現(xiàn)在單線程運行的代碼中牺陶,不能是多線程共享的,這樣有利于保證線程安全辣之。
2. 字符串
靜態(tài)字符串一律使用單引號或反引號掰伸,不使用雙引號
動態(tài)字符串使用反引號
3.解構(gòu)賦值
使用數(shù)組成員對變量賦值時,優(yōu)先使用解構(gòu)賦值
函數(shù)的參數(shù)如果是對象的成員怀估,優(yōu)先使用解構(gòu)賦值
如果函數(shù)返回多個值狮鸭,優(yōu)先使用對象的解構(gòu)賦值,而不是數(shù)組的解構(gòu)賦值
4. 對象
單行定義的對象多搀,最后一個成員不以逗號結(jié)尾歧蕉。多行定義的對象,最后一個成員以逗號結(jié)尾
對象盡量靜態(tài)化酗昼,一旦定義廊谓,就不得隨意添加新的屬性。如果添加屬性不可避免麻削,要使用Object.assign方法
如果對象的屬性名是動態(tài)的蒸痹,可以在創(chuàng)造對象的時候,使用屬性表達(dá)式定義呛哟。
5.數(shù)組
使用擴(kuò)展運算符(...)拷貝數(shù)組
使用Array.from方法叠荠,將類似數(shù)組的對象轉(zhuǎn)為數(shù)組
6.函數(shù)
立即執(zhí)行函數(shù)可以寫成箭頭函數(shù)的形式
簡單的、單行的扫责、不會復(fù)用的函數(shù)榛鼎,建議采用箭頭函數(shù)。如果函數(shù)體較為復(fù)雜鳖孤,行數(shù)較多者娱,還是應(yīng)該采用傳統(tǒng)的函數(shù)寫法
7. Map和Object
只有模擬現(xiàn)實世界的實體對象時,才使用Object苏揣。如果只是需要key : value的數(shù)據(jù)結(jié)構(gòu)黄鳍,使用Map結(jié)構(gòu)。因為Map有內(nèi)建的遍歷機(jī)制
8. 使用ESLint