ES6 學(xué)習(xí)筆記,如有錯誤回梧,歡迎指正臼勉。
筆記只記錄了一些個人認(rèn)為需要記住的知識點(diǎn)扑毡,其他的可以參考文末的網(wǎng)站柳沙。
let 和 const 命令
? ? ES6 新增了let 和 const 來聲明變量。
? ? var聲明: var 聲明 是聲明?全局變量?的妓柜。
? ? let聲明: let 聲明是 局部變量聲明别凤,所聲明的變量只在 let 命令所在的代碼塊內(nèi)有效。
? ? const聲明:const是?聲明常量?的领虹,const一旦聲明就?必須初始化值规哪,不能留到以后賦值,只聲明不賦值就會報錯塌衰。const的作用域和 let聲明相同诉稍,只在聲明所在的?塊級作用域?中有效。另外需要注意的是最疆,用 const 聲明的常量 不能?再進(jìn)行更改 杯巨。
?注意:① const 和 let聲明的變量,不可重復(fù)聲明努酸。
? ? ? ? ? ? ②const 和 let 聲明的變量不存在?變量提升
? ? ? ? ? ? ? ③?ES5中沒有塊級作用域服爷,ES6 中?引入了塊級作用域。
上述情況在ES5 中的正確表現(xiàn)形式:運(yùn)用了 閉包 和 立即執(zhí)行函數(shù),非常復(fù)雜
解析:用 var 聲明時仍源, 在全局范圍內(nèi)有效心褐,所以全局變量只有一個 i ,每次循環(huán) i? 都會發(fā)生變化笼踩, 而函數(shù)內(nèi)的 console.log(i) 逗爹, 里面的 i 指向 的就是全局的 i,而 函數(shù)又不是 立即執(zhí)行嚎于,等到所有代碼運(yùn)行結(jié)束掘而,才執(zhí)行setTimeout , 此時 i 已經(jīng)為10 于购, 所以輸出 10個 10 袍睡;
用 let 聲明是,當(dāng)前的 i 只在本輪循環(huán)有效 肋僧, 每次循環(huán)的 i 其實(shí)都是一個 新? 的變量斑胜。
變量的解構(gòu)賦值(常用)
? ? ? ? ? ? ?ES6 允許按照一定模式,從?數(shù)組?和?對象?中提取值色瘩,對變量進(jìn)行賦值,這被稱為解構(gòu)(Destructuring)逸寓。
? ? ? ????① 數(shù)組?的解構(gòu)賦值
? ??????????????????????如果解構(gòu)不成功居兆,變量的值就等于undefined!V裆臁D嗥堋!勋篓!
? ??????????注意:解構(gòu)賦值允許?使用默認(rèn)值吧享,ES6內(nèi)部使用?嚴(yán)格相等運(yùn)算符(===),只有當(dāng)數(shù)組成員嚴(yán)格等于 undefined 的時候譬嚣,默認(rèn)值才會生效钢颂。(見下圖,當(dāng)數(shù)組成員等于 null 時候拜银,默認(rèn)值不會生效殊鞭,因?yàn)?null 不嚴(yán)格等于 undefined)
? ?????② 對象?的解構(gòu)賦值
????????????????對象的解構(gòu)賦值的內(nèi)部機(jī)制是先找到同名屬性,再賦給對應(yīng)的變量尼桶。真正被賦值的是后者操灿,而不是前者。foo 是匹配模式泵督,baz 才是變量 ,真正被賦值的是變量 baz趾盐,而不是模式 foo 。
????????????????????對象的解構(gòu)也可以指定默認(rèn)值救鲤。
????③ 字符串 的解構(gòu)賦值
? ? ?④ 函數(shù)參數(shù) 的解構(gòu)賦值(見下文函數(shù)的擴(kuò)展)
? ? ?⑤?用途:1. 交換變量的值
? ? ? ? ? ? ? ? ? 2.從函數(shù)返回多個值
? ??????????????函數(shù)只能返回一個值久窟,如果要返回多個值,只能將它們放在數(shù)組或?qū)ο罄锓祷匮鸭颉S辛私鈽?gòu)賦值瘸羡,取出這些值就非常方便。
? ? ? ? ? ? ? ? ? 3.?函數(shù)參數(shù)的定義
? ? ? ? ? ? ? ? ? 4.提取 JSON 數(shù)據(jù)(用途較廣)
? ? ? ? ? ? ? ? ? 5.?函數(shù)參數(shù)的默認(rèn)值
? ? ? ? ? ? ? ? ? 6.?遍歷 Map 結(jié)構(gòu)(見后文的 ?Iterator 筆記)
? ? ? ? ? ? ? ? ??7.?輸入模塊的指定方法
? ??????????????const { SourceMapConsumer,SourceNode } = require("source-map");
字符串的擴(kuò)展
? ? 字符串模板(運(yùn)用廣泛):模板字符串(template string)是增強(qiáng)版的字符串搓茬,用反引號(`)標(biāo)識犹赖。模板字符串中嵌入變量,需要將變量名寫在 ${ } 之中卷仑。
????????????使用模板字符串表示多行字符串峻村,所有的?空格?和?縮進(jìn)?都會被保留在輸出之中。
函數(shù)的擴(kuò)展
? ??ES6 允許為函數(shù)的參數(shù)設(shè)置 默認(rèn)值锡凝,即直接寫在參數(shù)定義的后面粘昨。
? ??? ? 注意:參數(shù)變量是默認(rèn)聲明的,所以不能用let或const再次聲明窜锯。
? ??????????????使用參數(shù)默認(rèn)值時张肾,函數(shù)不能有同名參數(shù)。
? ??????與解構(gòu)賦值默認(rèn)值結(jié)合使用
? ??????上面代碼只使用了?對象的解構(gòu)賦值默認(rèn)值锚扎,沒有使用函數(shù)參數(shù)的默認(rèn)值吞瞪。只有當(dāng)函數(shù)foo的參數(shù)是一個對象時,變量 x 和 y 才會通過解構(gòu)賦值生成驾孔。如果函數(shù)foo調(diào)用時沒提供參數(shù)芍秆,變量x和y就不會生成,從而報錯翠勉。通過提供函數(shù)參數(shù)的默認(rèn)值妖啥,就可以避免這種情況。
? ??????????????上面代碼指定对碌,如果沒有提供參數(shù)荆虱,函數(shù)foo的參數(shù)?默認(rèn)為一個空對象。
? ? ? ? ? ? 練習(xí)題
? ??????????????兩種寫法都對函數(shù)的參數(shù) 設(shè)定了默認(rèn)值朽们,區(qū)別是寫法一函數(shù)參數(shù)的默認(rèn)值是空對象克伊,但是設(shè)置了對象解構(gòu)賦值的默認(rèn)值;寫法二函數(shù)參數(shù)的默認(rèn)值是一個有具體屬性的對象华坦,但是沒有設(shè)置對象解構(gòu)賦值的默認(rèn)值愿吹。
? ? ? ? ? ? ? ? 簡單來講,就是 傳了參數(shù)惜姐,函數(shù)參數(shù)的默認(rèn)值就不會起作用 犁跪; 沒傳參數(shù)椿息,函數(shù)參數(shù)的默認(rèn)值起作用。
? ? ? ? ? ? ? ? 傳了參數(shù)坷衍, 解構(gòu)賦值的默認(rèn)值 和 傳入的參數(shù) 進(jìn)行解構(gòu)寝优,寫法二 沒有 解構(gòu)默認(rèn)值,所以 如果 傳進(jìn)去的值枫耳,有缺少 X 或者? y乏矾,缺少的一個 都是 undefined。
? ? ? ? rest 參數(shù)
? ??????ES6 引入 rest 參數(shù)(形式為...變量名)迁杨,用于獲取函數(shù)的多余參數(shù)钻心,這樣就不需要使用arguments對象了。rest 參數(shù)搭配的變量是一個數(shù)組铅协,該變量將多余的參數(shù)放入數(shù)組中捷沸。
? ?? ? ??? ??簡單來說,rest 參數(shù) 是一個 數(shù)組:贰Q鞲!?ト2园亍! 將 參數(shù) 都放入 一個數(shù)組中去姜贡。
? ??????????????rest 參數(shù)之后不能再有其他參數(shù)(即只能是最后一個參數(shù))试吁,否則會報錯。
? ??????箭頭函數(shù): ES6 允許使用“箭頭”(=>)定義函數(shù)鲁豪。
? ?如果箭頭函數(shù)不需要參數(shù)或需要多個參數(shù)潘悼,就使用一個圓括號代表參數(shù)部分律秃。
? ? ? ? ? ? ? ?箭頭函數(shù)可以與變量解構(gòu)結(jié)合使用爬橡。
? ? ? ? ? ? ? ? 注意? !!!!!!!!!!
? ??????????????(1)函數(shù)體內(nèi)的this對象,就是定義時所在的對象棒动,而不是使用時所在的對象糙申。
????????????????(2)不可以當(dāng)作構(gòu)造函數(shù),也就是說船惨,不可以使用new命令柜裸,否則會拋出一個錯誤。
????????????????(3)不可以使用arguments對象粱锐,該對象在函數(shù)體內(nèi)不存在疙挺。如果要用,可以用 rest 參數(shù)代替怜浅。
????????????????(4)不可以使用yield命令铐然,因此箭頭函數(shù)不能用作 Generator 函數(shù)蔬崩。
????????????????上面四點(diǎn)中,第一點(diǎn)尤其值得注意搀暑。this對象的指向是可變的沥阳,但是在箭頭函數(shù)中,它是固定的自点。
? ??????????????????上面代碼中桐罕,轉(zhuǎn)換后的 ES5 版本清楚地說明了,箭頭函數(shù)里面根本沒有自己的this桂敛,而是引用外層的this功炮。
數(shù)組的擴(kuò)展
? ? ① 擴(kuò)展運(yùn)算符
擴(kuò)展運(yùn)算符(spread)是三個點(diǎn)(...)。它好比 rest 參數(shù)的逆運(yùn)算埠啃,將一個數(shù)組?轉(zhuǎn)為?用逗號分隔的參數(shù)序列死宣。
? ? ????該運(yùn)算符主要用于函數(shù)的調(diào)用,將一個數(shù)組變成參數(shù)序列碴开。
????擴(kuò)展運(yùn)算符的運(yùn)用:1. 復(fù)制數(shù)組
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2.合并數(shù)組
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3.與解構(gòu)賦值結(jié)合
? ? ? ? ? ?如果將擴(kuò)展運(yùn)算符用于數(shù)組賦值毅该,只能放在參數(shù)的最后一位,否則會報錯潦牛。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4.字符串
? ? ② Array.from( ) : Array.from方法用于將?兩類對象?轉(zhuǎn)為?真正的數(shù)組:類似數(shù)組的對象(array-like object)和可遍歷(iterable)的對象(包括 ES6 新增的數(shù)據(jù)結(jié)構(gòu) Set 和 Map).
? ??????這就是一個標(biāo)準(zhǔn)的JSON數(shù)組格式眶掌,跟普通的JSON對比是在最后多了一個length屬性。只要是這種?特殊的json格式?都可以輕松使用ES6的語法轉(zhuǎn)變成數(shù)組巴碗。(必須要有l(wèi)ength 屬性F优馈!O鹣U儇!)
③?Array.of( ) :將一組值轉(zhuǎn)換為數(shù)組逸爵。
? ??????Array.of總是返回參數(shù)值組成的數(shù)組具滴。如果沒有參數(shù),就返回一個空數(shù)組师倔。
?④ find( )實(shí)例方法
? ??????????數(shù)組實(shí)例的find方法构韵,用于找出第一個符合條件的數(shù)組成員。它的參數(shù)是一個回調(diào)函數(shù)趋艘,所有數(shù)組成員依次執(zhí)行該回調(diào)函數(shù)疲恢,直到找出第一個返回值為true的成員,然后返回該成員瓷胧。如果沒有符合條件的成員显拳,則返回undefined。
? ??????????find方法的回調(diào)函數(shù)可以接受三個參數(shù)搓萧,依次為當(dāng)前的值杂数、當(dāng)前的位置和原數(shù)組遇八。
⑤??includes( )?實(shí)例方法
? ??????表示某個數(shù)組是否包含給定的值,返回 布爾值
⑥ fill( )?實(shí)例方法
? ???????數(shù)組進(jìn)行填充耍休,它接收三個參數(shù)刃永,第一個參數(shù)是填充的變量,第二個是開始填充的位置羊精,第三個是填充到的位置斯够。數(shù)組中已有的元素,會被全部抹去喧锦。
對象的擴(kuò)展
? ? 屬性的簡潔表示法:ES6 中允許在對象中读规,直接寫變量。這時燃少,屬性名為變量名束亏,屬性值為變量的值。
? ???方法的簡潔表示法
? ? 綜合運(yùn)用
????????屬性名表達(dá)式
? ??????ES6 允許字面量定義對象時阵具,用 表達(dá)式 作為對象的屬性名碍遍,即把表達(dá)式放在方括號內(nèi)。
? ??????Object.is( ?) 對象比較
? ??????????它用來比較兩個值是否嚴(yán)格相等阳液,與嚴(yán)格比較運(yùn)算符(===)的行為基本一致怕敬。
? ??????Object.assign( ?)合并對象
? ??????????Object.assign方法用于對象的合并,將源對象(source)的所有可枚舉屬性帘皿,復(fù)制到目標(biāo)對象(target)东跪。Object.assign方法的第一個參數(shù)是目標(biāo)對象,后面的參數(shù)都是源對象鹰溜。
? ??????注意虽填,如果目標(biāo)對象與源對象有同名屬性,或多個源對象有同名屬性曹动,則后面的屬性會覆蓋前面的屬性斋日。
? ??Object.keys( 對象 )
? ? ? ? Object.keys方法返回一個數(shù)組,成員是參數(shù)對象自身的(不含繼承的)所有可遍歷(enumerable)屬性的?鍵名仁期。
????Object.values(?對象?)
????Object.values方法返回一個數(shù)組桑驱,成員是參數(shù)對象自身的(不含繼承的)所有可遍歷(enumerable)屬性的 鍵值竭恬。