字符串的擴(kuò)展
1??、字符的unicode表示法
首先要先對(duì)字符的unicode表示法有一個(gè)整體認(rèn)識(shí)。
其次,在ES6之前,unicode字符表示法只限于碼點(diǎn)在\u0000 ~\uFFFF之間的字符,超過(guò)此范圍的字符需用兩個(gè)雙字節(jié)表示,ES6對(duì)此做出的改進(jìn)為:
將碼點(diǎn)放入大括號(hào)中去,就能正確解讀該字符。
2??、字符串的遍歷器接口
ES6 為字符串添加了遍歷器接口,使得字符串可以被for...of循環(huán)遍歷。
除了遍歷字符串,這個(gè)遍歷器最大的優(yōu)點(diǎn)是可以識(shí)別大于0xFFFF的碼點(diǎn),傳統(tǒng)的for循環(huán)無(wú)法識(shí)別這樣的碼點(diǎn)。
3??、模板字符串
ES6 引入了模板字符串解決輸出模板比較繁瑣的問(wèn)題。
模板字符串(template string)是增強(qiáng)版的字符串,用反引號(hào)(`)標(biāo)識(shí)。
字符串的新增方法
1??、String.fromCodePoint()
如果知道了一個(gè)碼點(diǎn),想知道它表示的是什么字符。ES6之前我們可以使用:
String.fromCharCode(0x0030)來(lái)轉(zhuǎn)化成為字符。
上述的這個(gè)方法有個(gè)缺陷,就是它有限制,只能識(shí)別0x0000~0xFFFF之間的碼點(diǎn),超出后會(huì)溢出。
于是,我們這里要學(xué)習(xí)的就是這個(gè):String.fromCodePoint()
2??、String.raw()
String.raw()本質(zhì)上是一個(gè)正常的函數(shù),只是專(zhuān)用于
模板字符串的標(biāo)簽函數(shù)。
3??、實(shí)例方法:codePointAt()
不想看這里。
4??、實(shí)例方法:normalize()
ES6 提供字符串實(shí)例的normalize()方法,用來(lái)將字符的不同表示方法統(tǒng)一為同樣的形式,這稱(chēng)為 Unicode 正規(guī)化.
5??、實(shí)例方法:includes()、startWith()、endsWith()
這三個(gè)方法都支持第二個(gè)參數(shù),表示開(kāi)始搜索的位置。
6??、實(shí)例方法:padStart()、padEnd()
ES2017 引入了字符串補(bǔ)全長(zhǎng)度的功能。如果某個(gè)字符串不夠指定長(zhǎng)度,會(huì)在頭部或尾部補(bǔ)全。padStart()用于頭部補(bǔ)全,padEnd()用于尾部補(bǔ)全。
padStart()和padEnd()一共接受兩個(gè)參數(shù),第一個(gè)參數(shù)是字符串補(bǔ)全生效的最大長(zhǎng)度,第二個(gè)參數(shù)是用來(lái)補(bǔ)全的字符串。
7??、實(shí)例方法:trimStart()、trimEnd()
ES2019 對(duì)字符串實(shí)例新增了
trimStart()和trimEnd()這兩個(gè)方法。它們的行為與trim()一致,trimStart()消除字符串頭部的空格,trimEnd()消除尾部的空格。它們返回的都是新字符串,不會(huì)修改原始字符串。
數(shù)值的擴(kuò)展
1??、二進(jìn)制、八進(jìn)制表示法(分別用二、八進(jìn)制表示10)
ES6規(guī)定:二進(jìn)制與十進(jìn)制分別以
0b[B]、0o[O].
因此用二進(jìn)制表示數(shù)字10為:0B1010,用八進(jìn)制表示數(shù)字10為0O12;
2??、Number.isFinite()、Number.isNaN()
這個(gè)Number的這倆方法在日常開(kāi)發(fā)中幾乎沒(méi)用到過(guò)。
判斷一個(gè)數(shù)是不是有效,判斷一個(gè)數(shù)是不是數(shù)值。這里簡(jiǎn)單做下記錄,明確知道有這倆新方法。
3??、Number.parseInt()、Number.parseFloat()
這倆東西的出現(xiàn)頻率極高,ES6將這倆方法移植到了Number對(duì)象上,這么做的目的是逐步減少全局性方法,使得語(yǔ)言逐步模塊化。
因此下次使用這倆方法的時(shí)候用上Number,那就說(shuō)明對(duì)這個(gè)小知識(shí)點(diǎn)有了掌握。
4??、Number.isInteger()
Number.isInteger()用來(lái)判斷一個(gè)數(shù)值是否為整數(shù)。
5??、Number.EPSILON
ES6 在Number對(duì)象上面,新增一個(gè)極小的常量Number.EPSILON。根據(jù)規(guī)格,它表示 1 與大于 1 的最小浮點(diǎn)數(shù)之間的差。
Number.EPSILON實(shí)際上是 JavaScript 能夠表示的最小精度。誤差如果小于這個(gè)值,就可以認(rèn)為已經(jīng)沒(méi)有意義了,即不存在誤差了。
6??、安全整數(shù)和Number.isSafeInterger()
JavaScript能夠準(zhǔn)確表示的整數(shù)范圍是在-253到253之間(不含兩個(gè)端點(diǎn))。超過(guò)這個(gè)范圍,無(wú)法精確表示這個(gè)值。
ES6引入兩個(gè)常量來(lái)表示這個(gè)范圍的上下限:Number.MAX_SAFE_INTERGER和Number.MIN_SAFE_INTERGER.
Number.isSafeInteger()則是用來(lái)判斷一個(gè)整數(shù)是否落在這個(gè)范圍之內(nèi)。
7??、Math.trunc()
Math.trunc()用于去除一個(gè)整數(shù)的小數(shù)部分,返回整數(shù)部分。
8??、Math.sign()
Math.sign()用來(lái)判斷一個(gè)數(shù)是正數(shù)(+1)、負(fù)數(shù)(-1)、+0或-0.
函數(shù)的擴(kuò)展
1??、函數(shù)參數(shù)的默認(rèn)值
我們?cè)趯?xiě)一個(gè)工具函數(shù)的時(shí)候,要積極使用這種函數(shù)默認(rèn)值的寫(xiě)法,不僅讓我們對(duì)此函數(shù)傳值有一個(gè)整體了解,還可以減少因?yàn)閰?shù)傳遞錯(cuò)誤出現(xiàn)的bug。
2??、rest參數(shù)
ES6 引入 rest 參數(shù)(形式為...變量名),用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對(duì)象了。rest 參數(shù)搭配的變量是一個(gè)數(shù)組,該變量將多余的參數(shù)放入數(shù)組中。
注意,rest 參數(shù)之后不能再有其他參數(shù)(即只能是最后一個(gè)參數(shù)),否則會(huì)報(bào)錯(cuò)。
數(shù)組的擴(kuò)展
1??、擴(kuò)展運(yùn)算符
對(duì)于一個(gè)數(shù)組來(lái)說(shuō),如果使用擴(kuò)展運(yùn)算符,相當(dāng)于是rest參數(shù)的逆運(yùn)算,將一個(gè)數(shù)組轉(zhuǎn)為用逗號(hào)分割的參數(shù)序列。
2??、Array.from()
Array.from方法用于將兩類(lèi)對(duì)象轉(zhuǎn)為真正的數(shù)組:類(lèi)似數(shù)組的對(duì)象(array-like object)和可遍歷(iterable)的對(duì)象(包括 ES6 新增的數(shù)據(jù)結(jié)構(gòu) Set 和 Map)。
3??、Array.of()
Array.of()用于將一組值轉(zhuǎn)化為數(shù)組。
4??、數(shù)組實(shí)例的find()和findIndex()
數(shù)組實(shí)例的find方法,用于找出
第一個(gè)符合條件的數(shù)組成員。
數(shù)組實(shí)例的findIndex方法的用法與find方法非常類(lèi)似,返回第一個(gè)符合條件的數(shù)組成員的位置,如果所有成員都不符合條件,則返回-1。
5??、數(shù)組示例的fill()
fill方法使用給定值,填充一個(gè)數(shù)組。
let arr = [1,3,3,4,5];
arr.fill(2,1,2); //[1,2,3,4,5]
6??、數(shù)組實(shí)例的entries()、keys()和values()
ES6 提供三個(gè)新的方法——entries(),keys()和values()——用于遍歷數(shù)組。它們都返回一個(gè)遍歷器對(duì)象(詳見(jiàn)《Iterator》一章),可以用for...of循環(huán)進(jìn)行遍歷,唯一的區(qū)別是keys()是對(duì)鍵名的遍歷、values()是對(duì)鍵值的遍歷,entries()是對(duì)鍵值對(duì)的遍歷。
7??、數(shù)組實(shí)例的flat()、flatMap()
數(shù)組的成員有時(shí)還是數(shù)組,Array.prototype.flat()用于將嵌套的數(shù)組“拉平”,變成一維的數(shù)組。該方法返回一個(gè)新數(shù)組,對(duì)原數(shù)據(jù)沒(méi)有影響。
如果不管有多少層嵌套,都要轉(zhuǎn)成一維數(shù)組,可以用Infinity關(guān)鍵字作為參數(shù)。
8??、數(shù)組的空位
注意,空位不是undefined,一個(gè)位置的值等于undefined,依然是有值的,空位是指沒(méi)有任何值。
ES6明確將空位轉(zhuǎn)為undefined。
由于空位的處理規(guī)則非常不統(tǒng)一,所以建議避免出現(xiàn)空位。
對(duì)象的擴(kuò)展
1??、屬性的簡(jiǎn)潔表示法
對(duì)于鍵值對(duì)來(lái)說(shuō):屬性名就是變量名, 屬性值就是變量值。let obj ={name,age}
對(duì)于對(duì)象中的方法來(lái)說(shuō),也可以直接簡(jiǎn)寫(xiě) methods (){}
2??、屬性的可枚舉性和遍歷
對(duì)象的每一個(gè)屬性都有一個(gè)描述對(duì)象(Descriptor),用來(lái)控制該屬性的行為。
Object.getOwnPropertyDescriptor(obj,key)方法可以獲取該屬性的描述對(duì)象。
他們分別是:
- enumerable:可枚舉性,目前有四個(gè)操作會(huì)忽略enumerable為false的屬性
for...in:只遍歷自身的和繼承的可枚舉的屬性。
Object.keys():返回對(duì)象自身所有可枚舉的屬性鍵名。
JSON.stringfy():只串行化對(duì)象自身的可枚舉屬性。
Object.assign():忽略enumerable為false的屬性,只拷貝對(duì)象自身的可枚舉屬性。
3??、super關(guān)鍵字
我們知道,this關(guān)鍵字總是指向當(dāng)前函數(shù)所在的對(duì)象,ES6又新增了一個(gè)類(lèi)似的關(guān)鍵字super,指向當(dāng)前對(duì)象的原型對(duì)象。
注意,super指向原型對(duì)象時(shí),只能用在對(duì)象的方法之中,用在其他地方都會(huì)報(bào)錯(cuò)。(目前,只有對(duì)象方法的簡(jiǎn)寫(xiě)法可以讓 JavaScript 引擎確認(rèn),定義的是對(duì)象的方法。)
4??、對(duì)象的擴(kuò)展運(yùn)算符
解構(gòu)賦值:
- 解構(gòu)賦值等號(hào)的右邊要求是一個(gè)對(duì)象。
- 解構(gòu)賦值必須是最后一個(gè)參數(shù),否則會(huì)報(bào)錯(cuò)。
- 解構(gòu)賦值的拷貝是淺拷貝。
- 擴(kuò)展運(yùn)算符的解構(gòu)賦值,不能復(fù)制繼承自原型對(duì)象的屬性。
5??、鏈判斷運(yùn)算符
我們寫(xiě)代碼時(shí),會(huì)遇到判斷一個(gè)對(duì)象的某個(gè)屬性是否存在,比如我們需要判斷l(xiāng)mz的user信息的age屬性是否存在,我們安全的寫(xiě)法是這樣的:
if(lmz && lmz.user && lmz.user.age){return "age屬性存在! "}
ES2020引入了鏈判斷運(yùn)算符,簡(jiǎn)化上面寫(xiě)法:
if(lmz ?. user ?.age){return "age屬性存在!"}
6??、Null判斷運(yùn)算符
當(dāng)判斷某個(gè)屬性的值是undefined或者null的時(shí)候,我們一般使用
||來(lái)給定默認(rèn)值。但是這個(gè)符號(hào)有個(gè)缺陷,如果判斷的這個(gè)屬性是0或者false或者空字符串的時(shí)候,他同樣會(huì)返回||后面的值(默認(rèn)值生效)。
這個(gè)時(shí)候我們使用||這個(gè)符號(hào)就不太妙來(lái),ES2020引入了一個(gè)新的Null判斷運(yùn)算符:??,它的行為類(lèi)似||,但是只有運(yùn)算符左側(cè)的值為null或undefined時(shí),才會(huì)返回右側(cè)的值。
此運(yùn)算符的一個(gè)目的就是與鏈?zhǔn)竭\(yùn)算符一起使用,判斷一個(gè)屬性為null或undefined時(shí),給定默認(rèn)值。