1表蝙、let和const命令
let聲明的變量只在let所在的代碼塊有效,即有塊級作用域汇跨,不同于var;
let定義的變量不存在變量提升問題,必須先聲明后使用;
不能在同一作用域內(nèi)重復(fù)聲明變量游昼,這與ES5的var不同骄噪,故不能在函數(shù)作用域下直接重新聲明函數(shù)的參數(shù)澜公;
塊級作用域可以任意嵌套蝶防,內(nèi)存可以訪問外層殷费,外層不可以訪問內(nèi)層仍律,內(nèi)層可以重新定義外層的同名變量;
ES5嚴(yán)格模式規(guī)定函數(shù)必須在頂層作用域和函數(shù)內(nèi)聲明,其他情況(比如if代碼塊炕横、循環(huán)代碼塊)的聲明都會報錯份殿,但在ES6中可以;
const命令和let命令不同之處在于const用于定義常量腔寡,并在聲明變量時必須同時賦值糯彬,如const PI=3.14撩扒,不能寫成const PI;PI=3.14炒辉;
let和const命令聲明的全局變量不屬于全局對象的屬性,var命令和function命令聲明的全局變量屏轰,依舊是全局對象的屬性。另外還有import和class命令叨粘,故在ES6中共有6種聲明變量的方法升敲。
for循環(huán)有一個特別之處,就是設(shè)置循環(huán)變量的那部分是一個父作用域,而循環(huán)體內(nèi)部是一個單獨的子作用域鹏氧。
//函數(shù)內(nèi)部的變量i與循環(huán)變量i不在同一個作用域茸俭,有各自單獨的作用域
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
2艇炎、變量的解構(gòu)賦值
+、數(shù)組的解構(gòu)賦值基本用法是[a,b,c]=[1,2,3],然后a=1,b=2,c=3;
+鼻由、解構(gòu)分完全解構(gòu)和不完全解構(gòu)婆硬,不完全解構(gòu)有兩種情況:左邊少于右邊和右邊少于
左邊,右邊少于左邊時,沒有對應(yīng)值的變量賦值為undefined。解構(gòu)要求等號右邊是可
遍歷的結(jié)構(gòu),如數(shù)組坤邪,非空對象等怕磨;
+员帮、解構(gòu)賦值可以指定默認(rèn)值渣锦,如[a=1,b=2]=[]裂七,默認(rèn)值生效的條件是右邊對應(yīng)位置上
的值是不是嚴(yán)格等于undefined,如[a=1,b=2]=[undefined,null],此時a=1,b=null;
+、以上是數(shù)組的解構(gòu)賦值氮趋,對象也有解構(gòu)賦值,基本用法為{foo,bar}={foo:’a’,bar:’b’}昵观;
+啊犬、數(shù)組的元素是按次序排列的觉至,變量的取值由它的位置決定语御;而對象的屬性沒有次序应闯,
變量必須與屬性同名碉纺,才能取到正確的值唬涧,如果變量名與屬性名不一致捧搞,必須寫成下面
這樣{foo:fo}={foo:’a’}胎撇,此時就有fo=’a’ 也就是說晚树,對象的解構(gòu)賦值的內(nèi)部機(jī)制爵憎,是先找
到同名屬性宝鼓,然后再賦給對應(yīng)的變量愚铡。真正被賦值的是后者沥寥,而不是前者邑雅;
f+蒂阱、要將一個已經(jīng)聲明的變量用于解構(gòu)賦值录煤,必須非常小心妈踊。如var x;{x}={x=1};這種寫法
會報錯,因為JS引擎會將{x}理解成一個代碼塊從而引發(fā)語法錯誤萝勤,只有不將大括號寫
在行首才可避免敌卓,正確的寫法是({x}={x=1})趟径;
+蜗巧、對象的解構(gòu)賦值可以很方便的將現(xiàn)有對象的方法賦值到某個變量幕屹,如:
let {log,sin,cost}=Math;
+望拖、字符串的解構(gòu)賦值靠娱,const [a,b]=’he’像云,此時a=’h’,b=’e’迅诬,字符串被轉(zhuǎn)換成了一個類似
數(shù)組的對象侈贷,類似數(shù)組的對象都有一個length屬性俏蛮,因此還可以對這個屬性解構(gòu)賦值搏屑;
+辣恋、數(shù)值和布爾值的解構(gòu)賦值伟骨,當(dāng)?shù)忍栍疫吺菙?shù)值和布爾值則會先轉(zhuǎn)化為對象携狭,如:let
{toString:s}=123;s===Number.prototype.toString為true逛腿,解構(gòu)賦值的規(guī)則是鳄逾,只要等號右邊的值不是對象雕凹,就先將其轉(zhuǎn)為對象枚抵。由于undefined和null無法轉(zhuǎn)為對象,所以對它
們進(jìn)行解構(gòu)賦值苦锨,都會報錯舟舒;
+秃励、函數(shù)參數(shù)也可解構(gòu)賦值并可指定默認(rèn)值function move({x, y} = { x: 0, y: 0 }) {
return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]
當(dāng)調(diào)用move函數(shù)時皆尔,傳入的對象會覆蓋函數(shù)定義時指定的默認(rèn)值慷蠕,該默認(rèn)值只在調(diào)用
函數(shù)時不傳參數(shù)起作用砌们;
+浪感、圓括號問題影兽。不能使用圓括號的情況:1 變量聲明語句中不能帶有圓括號峻堰,2 函數(shù)
參數(shù)中捐名,模式不能帶有圓括號镶蹋,3 賦值語句中贺归,不能將整個模式拂酣,或嵌套模式中的一層婶熬,
放在圓括號之中赵颅。可以使用圓括號的情況:賦值語句的非模式部分洲赵,[(b)] = [3]; // 正確
({ p: (d) } = {}); // 正確 [(parseInt.prop)] = [3]; // 正確
3叠萍、字符串的擴(kuò)展
+苛谷、 JS允許用\uxxxx形式表示一個字符腹殿,這種表示只限于\u0000-\uFFFF之間的字符,超過該范圍的字符必須用兩個雙字節(jié)形式表達(dá)刻炒,ES6對這一點做了改進(jìn)坟奥,當(dāng)超過該范圍時爱谁,只要將碼點放入大括號即可访敌,如”\u{20BB7}”可輸出”吉”寺旺;
+、 JS內(nèi)部废赞,字符以UTF-16格式儲存唉地,每個字符固定為2字節(jié)极颓,對于大于0xFFFF的字符群嗤,JS會認(rèn)為是兩個字符狂秘,普通的charCodeAt方法和charAt方法無法正常工作破衔,ES6提供了codePointAt方法和fromCodePoint方法以及at方法可解決這個問題钱烟,codePointAt函數(shù)返回碼點的十進(jìn)制形式;
+曙博、 ES6給字符串添加了Iterator遍歷器接口羊瘩,使得字符串可以被for…of循環(huán)遍歷尘吗,這個遍歷器最大的優(yōu)點是可以識別大于0xFFFF的碼點睬捶;
+擒贸、 ES6提供了除indexOf()方法之外的三個方法:includes(),startsWith(),endsWith()介劫;
+座韵、 ES6提供了repeat()方法踢京,返回一個新字符串瓣距,表示將原字符串重復(fù)n次蹈丸,參數(shù)是小數(shù)時會向下取整慨默,不能為負(fù)或Infinity弧腥,是字符串時會先轉(zhuǎn)為數(shù)字虾攻;
+、 ES7提供了padStart(),padEnd()方法奇钞,用于補全字符串長度景埃,共接受兩個參數(shù)顶别,第一個參數(shù)用來指定字符串的最小長度完慧,第二個參數(shù)是用來補全的字符串屈尼;
+脾歧、 模板字符串鞭执,模板字符串(template string)是增強版的字符串蚕冬,用反引號(`)標(biāo)識。它可以當(dāng)作普通字符串使用获三,也可以用來定義多行字符串疙教,或者在字符串中嵌入變量贞谓,模板字符串中嵌入變量裸弦,需要將變量名寫在${}之中晕城,大括號內(nèi)部可以放入任意的JavaScript表達(dá)式砖顷,可以進(jìn)行運算赃梧,以及引用對象屬性
4几睛、正則表示式的擴(kuò)展
+所森、 字符串對象共有四個方法可使用正則表達(dá)式:match(),replace(),search(),split(),ES6將這4個方法夯接,在語言內(nèi)部全部調(diào)用RegExp的實例方法焕济,從而做到所有與正則相關(guān)的方法,全都定義在RegExp對象上;
+盔几、 添加了u修飾符和y修飾符晴弃,ES5只有i,g,m;
+逊拍、 添加了sticky屬性表示是否設(shè)置了y修飾符上鞠,增加flags屬性返回修飾符,ES5的source屬性是返回正則表達(dá)式的正文芯丧;
+芍阎、 ES5不支持后行斷言和后行否定斷言骗露,ES7中加入了;
5辨赐、數(shù)值的擴(kuò)展
+不恭、 ES6提供了二進(jìn)制和八進(jìn)制數(shù)值的新寫法沾瓦,分別用前綴0b(0B)和0o(0O)表示缕探,ES5的嚴(yán)格模式中八進(jìn)制不再允許使用0表示潭兽,將0b和0o前綴的字符串?dāng)?shù)值轉(zhuǎn)為十進(jìn)制怒坯,要使用Number方法嬉荆;
+限番、 提供了Number.isFinite()和Number.isNaN()兩個方法,用來檢查Infinite和NaN這兩個特殊值,與傳統(tǒng)的全局方法isFinite()和isNaN()的區(qū)別在于缤底,傳統(tǒng)方法先調(diào)用Number()將非數(shù)值的值轉(zhuǎn)為數(shù)值膘流,再進(jìn)行判斷彭谁,而這兩個新方法只對數(shù)值有效,非數(shù)值一律返回false;
+管闷、 ES6將全局方法parseInt()和parseFloat()搀菩,移植到Number對象上面谜洽,行為完全保持不變实束,Number.isInteger()用來判斷一個值是否為整數(shù)避矢。需要注意的是孔庭,在JavaScript內(nèi)部挣菲,整數(shù)和浮點數(shù)是同樣的儲存方法向抢,所以3和3.0被視為同一個值鸠姨,ES6在Number對象上面祟峦,新增一個極小的常量Number.EPSILON婶希,引入一個這么小的量的目的盟猖,在于為浮點數(shù)計算你弦,設(shè)置一個誤差范圍;
+忍法、 JavaScript能夠準(zhǔn)確表示的整數(shù)范圍在-253到253之間(不含兩個端點),超過這個范圍输莺,無法精確表示這個值,Number.isSafeInteger()則是用來判斷一個整數(shù)是否落在這個范圍之內(nèi);
+钟沛、 ES6在Math對象上新增了17個與數(shù)學(xué)相關(guān)的方法。所有這些方法都是靜態(tài)方法牺汤,只能在Math對象上調(diào)用桦沉。
6、數(shù)組的擴(kuò)展
+牙甫、 Array.from方法用于將兩類對象轉(zhuǎn)為真正的數(shù)組:類似數(shù)組的對象(array-like object)和可遍歷(iterable)的對象(包括ES6新增的數(shù)據(jù)結(jié)構(gòu)Set和Map)黄绩。值得提醒的是虑凛,擴(kuò)展運算符(...)也可以將某些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)為數(shù)組,擴(kuò)展運算符背后調(diào)用的是遍歷器接口(Symbol.iterator)帆调,如果一個對象沒有部署這個接口辆床,就無法轉(zhuǎn)換咨堤。Array.from方法則是還支持類似數(shù)組的對象。所謂類似數(shù)組的對象,本質(zhì)特征只有一點疟丙,即必須有l(wèi)ength屬性。因此杯聚,任何有l(wèi)ength屬性的對象故响,都可以通過Array.from方法轉(zhuǎn)為數(shù)組傀广,而此時擴(kuò)展運算符就無法轉(zhuǎn)換。Array.from還可以接受第二個參數(shù)被去,作用類似于數(shù)組的map方法主儡,用來對每個元素進(jìn)行處理奖唯,將處理后的值放入返回的數(shù)組惨缆;
+、 Array.of方法用于將一組值丰捷,轉(zhuǎn)換為數(shù)組坯墨,Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3],Array.of(3).length // 1病往;
+捣染、 數(shù)組實例的copyWithin方法,在當(dāng)前數(shù)組內(nèi)部停巷,將指定位置的成員復(fù)制到其他位置
(會覆蓋原有成員)耍攘,然后返回當(dāng)前數(shù)組。也就是說畔勤,使用這個方法蕾各,會修改當(dāng)前數(shù)組;
+庆揪、 數(shù)組實例的find方法式曲,用于找出第一個符合條件的數(shù)組成員。它的參數(shù)是一個回調(diào)
函數(shù),所有數(shù)組成員依次執(zhí)行該回調(diào)函數(shù)吝羞,直到找出第一個返回值為true的成員兰伤,然后返回該成員。如果沒有符合條件的成員钧排,則返回undefined敦腔,findIndex方法的用法與find方法非常類似,返回第一個符合條件的數(shù)組成員的位置恨溜,如果所有成員都不符合條件会烙,則返回-1,fill方法使用給定值筒捺,填充一個數(shù)組柏腻;
+、 ES6提供三個新的方法——entries()系吭,keys()和values()——用于遍歷數(shù)組五嫂。它們都返
回一個遍歷器對象(詳見《Iterator》一章),可以用for...of循環(huán)進(jìn)行遍歷肯尺,唯一的
區(qū)別是keys()是對鍵名的遍歷沃缘、values()是對鍵值的遍歷,entries()是對鍵值對的遍歷则吟;
+槐臀、 Array.prototype.includes方法返回一個布爾值,表示某個數(shù)組是否包含給定的值氓仲,與
字符串的includes方法類似水慨。該方法屬于ES7,但Babel轉(zhuǎn)碼器已經(jīng)支持敬扛,沒有該方法之前晰洒,我們通常使用數(shù)組的indexOf方法,檢查是否包含某個值啥箭,indexOf方法有兩個缺點谍珊,一是不夠語義化,它的含義是找到參數(shù)值的第一個出現(xiàn)位置急侥,所以要去比較是否不等于-1砌滞,表達(dá)起來不夠直觀。二是坏怪,它內(nèi)部使用嚴(yán)格相當(dāng)運算符(===)進(jìn)行判斷贝润,這會導(dǎo)致對NaN的誤判;
+陕悬、 關(guān)于數(shù)組空位:ES6則是明確將空位轉(zhuǎn)為undefined题暖;
7、函數(shù)的擴(kuò)展
+、 ES6允許為函數(shù)的參數(shù)設(shè)置默認(rèn)值胧卤,即直接寫在參數(shù)定義的后面唯绍,參數(shù)變量是默認(rèn)聲明的,所以不能用let或const再次聲明枝誊;
+况芒、 指定了默認(rèn)值以后,函數(shù)的length屬性叶撒,將返回沒有指定默認(rèn)值的參數(shù)個數(shù)绝骚。也就是說,指定了默認(rèn)值后祠够,length屬性將失真压汪,如果設(shè)置了默認(rèn)值的參數(shù)不是尾參數(shù),那么length屬性也不再計入后面的參數(shù)了古瓤。(function (a = 0, b, c) {}).length // 0 (function (a, b = 1, c) {}).length // 1
+止剖、 ES6引入rest參數(shù)(形式為“...變量名”),用于獲取函數(shù)的多余參數(shù)落君,這樣就不需要使用arguments對象了穿香。rest參數(shù)搭配的變量是一個數(shù)組,該變量將多余的參數(shù)放入數(shù)組中绎速。注意皮获,rest參數(shù)之后不能再有其他參數(shù)(即只能是最后一個參數(shù)),否則會報錯纹冤,函數(shù)的length屬性洒宝,不包括rest參數(shù);
+赵哲、 擴(kuò)展運算符(spread)是三個點(...)待德。它好比rest參數(shù)的逆運算,將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列枫夺,由于擴(kuò)展運算符可以展開數(shù)組,所以不再需要apply方法绘闷,將數(shù)組轉(zhuǎn)為函數(shù)的參數(shù)了橡庞;
+、 箭頭函數(shù)印蔗,ES6允許使用“箭頭”(=>)定義函數(shù)扒最,如果箭頭函數(shù)不需要參數(shù)或需要多個參數(shù),就使用一個圓括號代表參數(shù)部分华嘹,如果箭頭函數(shù)的代碼塊部分多于一條語句吧趣,就要使用大括號將它們括起來,并且使用return語句返回,由于大括號被解釋為代碼塊强挫,所以如果箭頭函數(shù)直接返回一個對象岔霸,必須在對象外面加上括號。箭頭函數(shù)有幾個使用注意點俯渤。(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ào)用優(yōu)化
8厌处、對象的擴(kuò)展
+鳖谈、 ES6允許直接寫入變量和函數(shù),作為對象的屬性和方法var foo = 'bar';var baz =
{foo};baz // {foo: "bar"}// 等同于var baz = {foo: foo};
var o = {
method() {
return "Hello!";
}
};
// 等同于
var o = {
method: function() {
return "Hello!";
}
};
+阔涉、 ES6允許字面量定義對象時缆娃,用方法二(表達(dá)式)作為對象的屬性名,即把表達(dá)式放在方括號內(nèi)let propKey = 'foo';let obj = { [propKey]: true, ['a' + 'bc']: 123};
+瑰排、 Object.is()用來比較兩個值是否嚴(yán)格相等贯要,與嚴(yán)格比較運算符(===)的行為基本一致。不同之處只有兩個:一是+0不等于-0椭住,二是NaN等于自身
+崇渗、 Object.assign方法用于對象的合并,將源對象(source)的所有可枚舉屬性京郑,復(fù)制到目標(biāo)對象(target)宅广,Object.assign方法實行的是淺拷貝,而不是深拷貝些举。也就是說跟狱,如果源對象某個屬性的值是對象,那么目標(biāo)對象拷貝得到的是這個對象的引用户魏,Object.assign可以用來處理數(shù)組驶臊,但是會把數(shù)組視為對象挪挤。用途:1為對象添加屬性和方法2克隆對象3合并多個對象4為屬性指定默認(rèn)值
+、 可枚舉性关翎。ES5有三個操作會忽略enumerable為false的屬性扛门,for...in 循環(huán):只遍歷對象自身的和繼承的可枚舉的屬性,Object.keys():返回對象自身的所有可枚舉的屬性的鍵名笤休,JSON.stringify():只串行化對象自身的可枚舉的屬性尖飞,ES6新增了兩個操作,Object.assign():只拷貝對象自身的可枚舉的屬性Reflect.enumerate():返回所有for...in循環(huán)會遍歷的屬性店雅。操作中引入繼承的屬性會讓問題復(fù)雜化政基,大多數(shù)時候,我們只關(guān)心對象自身的屬性闹啦。所以沮明,盡量不要用for...in循環(huán),而用Object.keys()代替
+窍奋、 ES6新增結(jié)構(gòu)Set和Map荐健,Set類似于數(shù)組,但是成員的值都是唯一的琳袄,沒有重復(fù)的值.Set函數(shù)可以接受一個數(shù)組(或類似數(shù)組的對象)作為參數(shù)江场,用來初始化. Set結(jié)構(gòu)的實例有以下屬性。Set.prototype.constructor:構(gòu)造函數(shù)窖逗,默認(rèn)就是Set函數(shù)址否。Set.prototype.size:返回Set實例的成員總數(shù)。add(value):添加某個值碎紊,返回Set結(jié)構(gòu)本身佑附。delete(value):刪除某個值,返回一個布爾值仗考,表示刪除是否成功音同。has(value):返回一個布爾值,表示該值是否為Set的成員秃嗜。clear():清除所有成員权均,沒有返回值。keys():返回一個鍵名的遍歷器values():返回一個鍵值的遍歷器entries():返回一個鍵值對的遍歷器forEach():使用回調(diào)函數(shù)遍歷每個成員痪寻。螺句。Map數(shù)據(jù)結(jié)構(gòu)。它類似于對象橡类,也是鍵值對的集合,但是“鍵”的范圍不限于字符串芽唇,各種類型的值(包括對象)都可以當(dāng)作鍵顾画,可以接受一個數(shù)組作為參數(shù)取劫。該數(shù)組的成員是一個個表示鍵值對的數(shù)組。
9研侣、模塊化
+谱邪、 ES6模塊的設(shè)計思想,是盡量的靜態(tài)化庶诡,使得編譯時就能確定模塊的依賴關(guān)系惦银,以及輸入和輸出的變量。CommonJS和AMD模塊末誓,都只能在運行時確定這些東西扯俱。自動采用嚴(yán)格模式,不管你有沒有在模塊頭部加上"use strict";
+喇澡、 模塊功能主要由兩個命令構(gòu)成:export和import迅栅。export命令用于規(guī)定模塊的對外接口,import命令用于輸入其他模塊提供的功能晴玖;
+读存、 export用法總結(jié):1輸出變量:export var m=1;或者var m=1;export {m} 2輸出函數(shù):export function f(){}或者function(){} export {f} 可以使用as來指定輸出別名
+、 import用法總結(jié):1呕屎、import命令接受一個對象(用大括號表示)让簿,里面指定要從其他模塊導(dǎo)入的變量名。大括號里面的變量名秀睛,必須與被導(dǎo)入模塊對外接口的名稱相同尔当。如果想為輸入的變量重新取一個名字,import命令要使用as關(guān)鍵字琅催,將輸入的變量重命名居凶。注意,import命令具有提升效果藤抡,會提升到整個模塊的頭部侠碧,首先執(zhí)行,2缠黍、如果在一個模塊之中弄兜,先輸入后輸出同一個模塊,import語句可以與export語句寫在一起export { es6 as default } from './someModule';// 等同import { es6 } from './someModule';export default es6;上面代碼中瓷式,export和import語句可以結(jié)合在一起替饿,寫成一行。但是從可讀性考慮贸典,不建議采用這種寫法视卢,而應(yīng)該采用標(biāo)準(zhǔn)寫法,3廊驼、除了指定加載某個輸出值据过,還可以使用整體加載惋砂,即用星號()指定一個對象,所有輸出值都加載在這個對象上面绳锅。這時一般會使用as將()重命名西饵;
+、 export default命令:使用import命令的時候鳞芙,用戶需要知道所要加載的變量名或函數(shù)名眷柔,否則無法加載,該命令可以讓用戶自由命名要加載的變量和函數(shù)原朝。用法和export相似驯嘱,只是第二種用法不能加大括號,且使用import導(dǎo)入默認(rèn)值時也不能加大括號竿拆;
+宙拉、 模塊的繼承:先導(dǎo)入要繼承的模塊,再將其輸出就OK丙笋,其中可以加一下自己的模塊谢澈,export * from 'circle';
10、Class
+御板、 基本語法:class Point{ constructor(x,y){this.x=x;this.y=y} toString(){}} 必須有contructor函數(shù)锥忿,定義的方法是直接定義在原型上的。類的數(shù)據(jù)類型就是函數(shù)怠肋,類本身就指向構(gòu)造函數(shù)敬鬓。類的內(nèi)部所有定義的方法,都是不可枚舉的笙各,這一點與ES5的行為不一致
+钉答、 與函數(shù)一樣,Class也可以使用表達(dá)式的形式定義杈抢。
const MyClass = class Me {
getClassName() {
return Me.name;
}
};
上面代碼使用表達(dá)式定義了一個類数尿。需要注意的是,這個類的名字是MyClass而不是Me惶楼,Me只在Class的內(nèi)部代碼可用右蹦,指代當(dāng)前類
+、 繼承:extends歼捐。子類必須在contructor函數(shù)中調(diào)用super函數(shù)來創(chuàng)建this何陆,super這個關(guān)鍵字,有兩種用法豹储,含義不同贷盲。
(1)作為函數(shù)調(diào)用時(即super(...args)),super代表父類的構(gòu)造函數(shù)剥扣。
(2)作為對象調(diào)用時(即super.prop或super.method())晃洒,super代表父類慨灭。注意朦乏,此時super即可以引用父類實例的屬性和方法球及,也可以引用父類的靜態(tài)方法。
呻疹、 Class的靜態(tài)方法吃引,所有在類中定義的方法,都會被實例繼承刽锤。如果在一個方法前镊尺,加上static關(guān)鍵字,就表示該方法不會被實例繼承并思,而是直接通過類來調(diào)用庐氮,這就稱為“靜態(tài)方法”。
宋彼、 Class的靜態(tài)屬性和實例屬性:類的實例屬性可以用等式弄砍,寫入類的定義之中,不用寫在類的constructor方法里面输涕,類的靜態(tài)屬性只要在上面的實例屬性寫法前面音婶,加上static關(guān)鍵字就可以了
+、 new.target屬性 new是從構(gòu)造函數(shù)生成實例的命令莱坎。ES6為new命令引入了一個new.target屬性衣式,(在構(gòu)造函數(shù)中)返回new命令作用于的那個構(gòu)造函數(shù)。如果構(gòu)造函數(shù)不是通過new命令調(diào)用的檐什,new.target會返回undefined碴卧,因此這個屬性可以用來確定構(gòu)造函數(shù)是怎么調(diào)用的。
11乃正、編程規(guī)范
+住册、 使用let代替var;
+烫葬、 靜態(tài)字符串一律使用單引號或反引號界弧,不使用雙引號。動態(tài)字符串使用反引號搭综;
+垢箕、 使用數(shù)組成員對變量賦值時,優(yōu)先使用解構(gòu)賦值兑巾,函數(shù)的參數(shù)如果是對象的成員条获,優(yōu)先使用解構(gòu)賦值,如果函數(shù)返回多個值蒋歌,優(yōu)先使用對象的解構(gòu)賦值帅掘,而不是數(shù)組的解構(gòu)賦值委煤。這樣便于以后添加返回值,以及更改返回值的順序修档。
+碧绞、 單行定義的對象,最后一個成員不以逗號結(jié)尾吱窝。多行定義的對象讥邻,最后一個成員以逗號結(jié)尾。對象盡量靜態(tài)化院峡,一旦定義兴使,就不得隨意添加新的屬性。如果添加屬性不可避免照激,要使用Object.assign方法发魄,如果對象的屬性名是動態(tài)的,可以在創(chuàng)造對象的時候俩垃,使用屬性表達(dá)式定義励幼。
+、 使用擴(kuò)展運算符(...)拷貝數(shù)組吆寨,使用Array.from方法赏淌,將類似數(shù)組的對象轉(zhuǎn)為數(shù)組
+、 那些需要使用函數(shù)表達(dá)式的場合啄清,盡量用箭頭函數(shù)代替六水。因為這樣更簡潔,而且綁定了this辣卒。簡單的掷贾、單行的、不會復(fù)用的函數(shù)荣茫,建議采用箭頭函數(shù)想帅。如果函數(shù)體較為復(fù)雜,行數(shù)較多啡莉,還是應(yīng)該采用傳統(tǒng)的函數(shù)寫法港准。所有配置項都應(yīng)該集中在一個對象,放在最后一個參數(shù)咧欣,布爾值不可以直接作為參數(shù)
+浅缸、 不要在函數(shù)體內(nèi)使用arguments變量,使用rest運算符(...)代替。因為rest運算符顯式表明你想要獲取參數(shù),而且arguments是一個類似數(shù)組的對象楚殿,而rest運算符可以提供一個真正的數(shù)組贺纲,使用默認(rèn)值語法設(shè)置函數(shù)參數(shù)的默認(rèn)值
+毛萌、 總是用Class苟弛,取代需要prototype的操作,使用extends實現(xiàn)繼承阁将,因為這樣更簡單膏秫,不會有破壞instanceof運算的危險,使用import取代require冀痕,使用export取代module.exports荔睹,如果模塊只有一個輸出值,就使用export default言蛇,如果模塊有多個輸出值,就不使用export default宵距,不要export default與普通的export同時使用
12腊尚、一些補充
- ECMAScript 和 JavaScript 的關(guān)系
簡單說就是規(guī)范和實現(xiàn)的關(guān)系,前者負(fù)責(zé)指定規(guī)范满哪,后者負(fù)責(zé)實現(xiàn)婿斥。此外 ES2015=ES6
13、一些面試題回答
- let 哨鸭、const和var有什么區(qū)別
1民宿、作用域不同,var 是全局作用域像鸡,let 活鹰、const有自己的塊級作用域
2、let 只估、const不存在變量提升志群,必須先申明后使用