ES6簡(jiǎn)介
ECMAScript 第六代標(biāo)準(zhǔn)
let 和 const
用于聲明變量或聲明常量
變量和常量
var 和 let 聲明的就是變量胸哥,變量初始化后還可以重新賦值。
const 聲明的是常量晃危,常量一旦初始化后就不能重新賦值浮声,否則報(bào)錯(cuò)礁叔。常量可以防止不經(jīng)意間改變了不能改變的量妄荔。如果常量值的類型是引用類型泼菌,例如對(duì)象谍肤,可以修改對(duì)象屬性的值。
const 聲明常量一旦聲明哗伯,就必須完成初始化荒揣,否則報(bào)錯(cuò)
let、const 與 var 的區(qū)別
- 重復(fù)聲明:var 支持重復(fù)聲明焊刹,let 與 const 不支持系任。
- 變量提升:let 與 const 不存在變量提升。
- 暫時(shí)性死區(qū):只要作用域內(nèi)存在 let 和 const 伴澄,他們聲明的量就會(huì)綁定作用域赋除,該量不再受外部影響阱缓。
- window對(duì)象的屬性和方法:let 和 const 聲明的量不會(huì)變成 window 對(duì)象的屬性或方法非凌。
- 塊級(jí)作用域: let 與 const 存在塊級(jí)作用域。
模板字符串
一般字符串:?jiǎn)我?hào)和雙引號(hào)荆针。
模板字符串:反引號(hào)敞嗡。
特征:
- 模板字符串中所有空格、換行航背、縮進(jìn)都被保留在輸出中喉悴。
- 同樣可以使用轉(zhuǎn)義字符輸出反引號(hào)、反斜杠等特殊字符玖媚。
- 可以直接在模板字符串中使用
${}
注入內(nèi)容(變量箕肃,屬性值,函數(shù)值今魔,計(jì)算值等)
標(biāo)簽?zāi)0?/h2>
是函數(shù)調(diào)用的一種特殊形式勺像。模板字符串可以緊跟在一個(gè)函數(shù)后面,該函數(shù)將被調(diào)用來(lái)處理這個(gè)模板字符串错森,這被成為“標(biāo)簽?zāi)0濉惫δ芤骰拢纾?/p>
alert('hello')
//等同于
alert`hello`
"標(biāo)簽"指的就是函數(shù),緊跟在后面的模板字符串就是他的參數(shù)涩维。
如果模板字符串中有變量殃姓,就不是簡(jiǎn)單的調(diào)用了,而是會(huì)將模板字符串先處理成多個(gè)參數(shù)瓦阐,再調(diào)用函數(shù)蜗侈。
let a = 5;
let b = 10;
function tag(tpldata,...values){
console.log(tpldata);
console.log(values);
console.log(arguments);
}
tag`hello ${a+b} world ${a*b}`
//等同于
tag(['hello',' world ',''],15,50)
“標(biāo)簽?zāi)0濉钡囊粋€(gè)重要應(yīng)用,就是過(guò)濾HTML字符串睡蟋,防止用戶注入代碼
let message =
SaferHTML`<p>${sender} has sent you a message.</p>`;
function SaferHTML(templateData) {
let s = templateData[0];
for (let i = 1; i < arguments.length; i++) {
let arg = String(arguments[i]);
// Escape special characters in the substitution.
s += arg.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">");
// Don't escape special characters in the template.
s += templateData[i];
}
return s;}
箭頭函數(shù)
寫法: ()=>{}
小括號(hào)內(nèi)參數(shù)踏幻,等號(hào)大于號(hào),中括號(hào)內(nèi)函數(shù)體薄湿。
通常需要用一個(gè)變量或常量接收叫倍。
注意事項(xiàng)
- 單個(gè)參數(shù)可省略小括號(hào)偷卧,0個(gè)或多個(gè)不可省略。
- 單行函數(shù)體可同時(shí)省略大括號(hào)和 return 吆倦,必須同時(shí)听诸。
- 單行對(duì)象如果要省略大括號(hào),需要在對(duì)象外加小括號(hào):例如
const add = (x+y)=>({value:x+y})
箭頭函數(shù)沒(méi)有自己的this
非箭頭函數(shù)執(zhí)行一定會(huì)產(chǎn)生屬于這個(gè)函數(shù)的this蚕泽,箭頭函數(shù)沒(méi)有自己的this晌梨,只會(huì)從自己的作用域鏈的上一層繼承 this.
箭頭函數(shù)使用注意
- 不能作為構(gòu)造函數(shù)。
- 需要 this 指向調(diào)用對(duì)象的時(shí)候箭頭函數(shù)不適用须妻。
- 需要 arguments 的時(shí)候仔蝌,箭頭函數(shù)沒(méi)有 arguments 』睦簦可以用剩余參數(shù)替代敛惊。
Iterator 迭代器/遍歷器
找到 iterator
先創(chuàng)建一個(gè)數(shù)組 const arr = [1,2]
用控制臺(tái)查看,深挖其屬性會(huì)有個(gè) Symbol.iterator 绰更,執(zhí)行該方法 arr[Symbol.iterator]()
執(zhí)行后會(huì)返回一個(gè) Array Iterator{}
可以用一個(gè)量接收瞧挤。
使用Iterator
iterator調(diào)用 next() 方法,會(huì)返回 {value: xxx , done: xxx}
可迭代對(duì)象
只要有 Symbol.iterator 方法儡湾,且這個(gè)方法調(diào)用后會(huì)產(chǎn)生一個(gè) iterator 特恬。
例如:數(shù)組、字符串徐钠、arguments癌刽、NodeList、Set尝丐、Map显拜、剩余參數(shù) 等。
一般對(duì)象不是可迭代對(duì)象摊崭,可以給一般對(duì)象強(qiáng)行添加 Symbol.iterator 方法讼油。
obj[Symbol.iterator] = ()=>{
let index = ;
return(
next(){
index++;
……
}
)
}
//類數(shù)組對(duì)象可以直接偷數(shù)組原型上的
LEISHUZU[Symbol.iterator] = Array[Symbol.iterator]
for of
想要遍歷一些東西的時(shí)候,五花八門呢簸,對(duì)象用 for(...in...) 矮台,數(shù)組用 for 循環(huán)、forEach 方法根时。而 iterator 只有一種遍歷方式瘦赫,就是“下一個(gè)”,一般用系統(tǒng)封裝好的 for(...of...)
for(let item of arr){
}
- for(...of...) 循環(huán)只會(huì)遍歷出那些 done 為false時(shí)對(duì)應(yīng)的 value 值蛤迎。(如果改寫了對(duì)象的Symbol.iterator()之后比如把done改為false則會(huì)瘋狂輸出)
- for(...of...) 可以和 break 确虱、 continue 一起使用。
可迭代對(duì)象的方法
forEach()
forEach() 方法可遍歷 可迭代對(duì)象 替裆。
forEach() 傳入的第一個(gè)參數(shù) 是一個(gè)回調(diào)函數(shù)校辩【轿剩回調(diào)函數(shù)可以使用三個(gè)參數(shù),按順序分別是 (1)可遍歷對(duì)象鍵值對(duì)的值 (2)可遍歷對(duì)線鍵值對(duì)的鍵 (3)可遍歷對(duì)像本身宜咒。
forEach() 傳入的第二個(gè)參數(shù) 是 this 指向(非箭頭函數(shù)時(shí)才可用)惠赫。例如:
let arr = [11,22,33];
arr.forEach((value,key,self)=>{
console.log(value,key,self)
},arr)
keys()
一些可迭代對(duì)象可以執(zhí)行 keys() 方法,遍歷此方法得到的對(duì)象故黑,可以取得鍵名(例如數(shù)組的索引值儿咱,可迭代對(duì)象的鍵名)。例如:
let arr = [1,2,3]
for(let k of arr.keys()){
console.log(k)
}
values()
可迭代對(duì)象的 values() 方法场晶,遍歷此方法返回的對(duì)象可以取得鍵值對(duì)的值(低版本瀏覽器不支持)
let arr = [1,2,3]
for(let k of arr.values()){
console.log(k)
}
entries()
可迭代對(duì)象的 entries() 方法混埠,遍歷此方法返回的對(duì)象可以取得鍵值對(duì)(索引+值組成的數(shù)組)
let arr = [1,2,3]
for(let k of arr.entries()){
console.log(k)
}
生成器函數(shù)
生成器函數(shù),在舊函數(shù)聲明方法 function fc(){}
中诗轻,在function關(guān)鍵字和函數(shù)名中間插入一個(gè)*號(hào)
function* (){}
普通函數(shù)執(zhí)行時(shí)沒(méi)有停止功能 Generator函數(shù)可以暫停
Generator 生成器 返回的是iterator接口
CO庫(kù)就是不停的調(diào)用next方法將最后結(jié)果返回
Generator 中 yield 后面只能跟 Thunk 函數(shù)或 Promise 對(duì)象
function * gen(){
console.log(arg);
let one = yield 111;
console.log(one)
}
let iterator = gen('AAA')
console.log(iterator.next());
console.log(iterator.next('BBB'))
next方法里面可以傳入實(shí)參钳宪,傳入的實(shí)參將會(huì)作為上一個(gè)yield整體返回的結(jié)果
展開(kāi)運(yùn)算符
... 可用于 可迭代對(duì)象 的展開(kāi)。
例如概耻,可以用于數(shù)組展開(kāi)使套,把數(shù)組拆成一個(gè)一個(gè)數(shù)字罐呼。例如:Math.min 和Math.max 只能計(jì)算一串參數(shù)的最大最小值不能傳入數(shù)組鞠柄,這時(shí)就能傳入數(shù)組同時(shí)用展開(kāi)運(yùn)算符展開(kāi)。
let arr = [1,2,3];
//直接Math.min(arr)則不計(jì)算嫉柴,可以
Math.min(...arr);
展開(kāi)運(yùn)算符可用于數(shù)組淺復(fù)制(淺克卵岫拧),例如
let arr1 = [1,2,3];
let arr2 = [...arr1]
所以展開(kāi) 可迭代對(duì)象 外直接套一個(gè)中括號(hào)可以快速轉(zhuǎn)變?yōu)橐粋€(gè)數(shù)組计螺。
展開(kāi)運(yùn)算符可以用于 對(duì)象 展開(kāi)
但不能直接展開(kāi)夯尽,只能在 {} 大括號(hào)中展開(kāi)。
所以還可以用于對(duì)象復(fù)制登馒,也可以用于合并對(duì)象匙握,用于合并對(duì)象時(shí),后展開(kāi)的與前展開(kāi)的對(duì)象同名的屬性會(huì)覆蓋陈轿。
展開(kāi)空對(duì)象沒(méi)有效果
let obj1 = {name:'mingzi',age:18}
let obj2 = {...obj1}
展開(kāi)運(yùn)算符只能“淺展開(kāi)”
即只能展開(kāi)一層
展開(kāi)運(yùn)算符特殊用法:剩余參數(shù)
當(dāng)函數(shù)執(zhí)行傳入 比形參數(shù)量更多的 實(shí)參時(shí)圈纺,可以用剩余參數(shù)接受,寫法 ...xxx 麦射,本質(zhì)是個(gè)數(shù)組蛾娶,即使沒(méi)有值,也是個(gè)控股數(shù)組潜秋,讀取時(shí)不用 ... 直接讀 xxx 即可蛔琅。例如
function func(a,b,...sycs){console.log(sycs)}
func(1,2,3,4,5,6,7,8)
//返回?cái)?shù)組[3,4,5,6,7,8]
箭頭函數(shù)中的剩余參數(shù)
箭頭函數(shù)中,因?yàn)榧^函數(shù)只有一個(gè)參數(shù)的時(shí)候可以省略小括號(hào)峻呛,但即使只有一個(gè)剩余參數(shù)罗售,也不能省略小括號(hào)辜窑。
箭頭函數(shù)沒(méi)有arguments,所以可以用剩余參數(shù)替代寨躁,且剩余參數(shù)可以用數(shù)組的方法谬擦。
剩余參數(shù)必須、只能是最后一個(gè)參數(shù)朽缎,之后不能有其他參數(shù)惨远,否則報(bào)錯(cuò)
剩余參數(shù)可以與解構(gòu)賦值結(jié)合使用。
剩余參數(shù)與對(duì)象解構(gòu)賦值結(jié)合使用會(huì)成為剩余元素话肖。
解構(gòu)賦值
- 將 可迭代對(duì)象 的值 賦給一個(gè) 可迭代對(duì)象 書寫形式的結(jié)構(gòu)北秽,例如:
const [a,b] = [1,2]
- 對(duì)象也可以使用解構(gòu)賦值,但必須滿足 1.模式(結(jié)構(gòu))匹配 2.屬性名相同的完成匹配最筒。
- 其他數(shù)值類型也可以使用解構(gòu)賦值贺氓,例如number和boolean,會(huì)先將等號(hào)右邊的值先轉(zhuǎn)為對(duì)象床蜘。但無(wú)法解構(gòu)其內(nèi)容辙培,只能提取繼承的屬性。
- undefined 和 null 無(wú)法進(jìn)行解構(gòu)賦值邢锯。
可迭代對(duì)象全部都可以使用數(shù)組形式完成結(jié)構(gòu)賦值扬蕊,字符串還可以使用對(duì)象的結(jié)構(gòu)完成解構(gòu)賦值,例如: let {0:a} = 'bilibili'
丹擎,此時(shí) a 為下標(biāo)為 0 的字母b尾抑。
解構(gòu)賦值的默認(rèn)值
可以給解構(gòu)賦值的常量變量賦一個(gè)默認(rèn)值,例如 let[a=1,b=2]=[]
注意:只有右邊與左邊解構(gòu)賦值嚴(yán)格等于 undefined 時(shí)蒂培,默認(rèn)值才會(huì)生效再愈。默認(rèn)值擁有惰性求值的特性,即用得到才執(zhí)行求值式求值护戳,用不到則不執(zhí)行翎冲。
解構(gòu)賦值的應(yīng)用用途
解構(gòu)賦值可以用于快捷交換變量值,例如
let x=1,y=2;
[x,y]=[y,x]
//此時(shí)x和y就快速交換了值媳荒。
Set
Set是一些列無(wú)序抗悍、沒(méi)有重復(fù)值的數(shù)據(jù)集合。
無(wú)序: Set沒(méi)有下標(biāo)去標(biāo)識(shí)每一個(gè)值肺樟,所以set是無(wú)序的檐春,不能像數(shù)組一樣通過(guò)下標(biāo)去訪問(wèn) set 的成員,但遍歷 set 的時(shí)候么伯,是根據(jù)成員添加進(jìn) set 的順序進(jìn)行遍歷的疟暖。
沒(méi)有重復(fù)值: Set會(huì)自動(dòng)去重,Set重復(fù)值的判斷遵循全等原則,但NaN除外俐巴,在Set中NaN也不可重復(fù)骨望。
創(chuàng)建一個(gè) Set
使用 Set 構(gòu)造函數(shù) const se = new Set()
即可創(chuàng)建一個(gè)set,創(chuàng)建 Set 時(shí)可以傳入一個(gè)可迭代對(duì)象作為參數(shù)欣舵,構(gòu)造出來(lái)的Set就會(huì)擁有對(duì)象里的成員擎鸠,例如:
let arr = [1,2,3]
const se = new Set(arr)
Set 的屬性
size:可以訪問(wèn)Set里面的成員個(gè)數(shù)。new Set().size
會(huì)返回一個(gè)0.
Set 的常用方法
方法 | 作用 |
---|---|
add() | 添加成員缘圈,可連續(xù)使用 |
has() | 查看是否有某個(gè)成員劣光,返回布爾值 |
delete() | 刪除某個(gè)成員 |
clear() | 清除所有成員 |
forEach() | 遍歷 |
add
可以連續(xù)添加,例如:
const se = new Set()
se.add(1).add(2).add(3)
delete
如果刪除不存在的成員糟把,則什么都不會(huì)發(fā)生绢涡,也不會(huì)報(bào)錯(cuò)
forEach
Set 的 forEach 是按照成員添加進(jìn)Set的順序遍歷的
Set 用途
Set 可以用于 可迭代對(duì)象 去重,例如數(shù)組去重遣疯,字符串去重雄可。或者需要使用Set方法的地方也可以轉(zhuǎn)換成Set
Map
Map 和對(duì)象都是鍵值對(duì)的集合缠犀。
Map 和對(duì)象的區(qū)別:
對(duì)象一般用字符串當(dāng)作鍵数苫,Map 可以用所有數(shù)據(jù)類型的值當(dāng)鍵,包括引用類型辨液。
創(chuàng)建一個(gè) Map
使用 Map 構(gòu)造函數(shù) const ma = new Map()
即可創(chuàng)建一個(gè) Map 虐急,創(chuàng)建 Map 時(shí)可以傳入一個(gè) entry object (例如二維數(shù)組,二維set對(duì)象室梅,map對(duì)象)戏仓,例如:
let arr2d = [
[1,2],
[3,4],
[5,6]
]
const ma = new Map(arr2d);
Map 屬性
size:獲取有幾個(gè)鍵值對(duì),上面的代碼然后 ma.size
會(huì)返回3.
Map 的方法
方法 | 作用 |
---|---|
set() | 添加新成員 |
get() | 獲取成員 |
has() | 判斷是否有這個(gè)成員返回布爾值 |
delete() | 刪除成員亡鼠,如果沒(méi)有則無(wú)事發(fā)生也不報(bào)錯(cuò) |
clear() | 清除所有成員 |
forEach() | 遍歷成員 |
set
可連續(xù)使用,例如 new Map().set(9,8).set(7,6)
敷待,當(dāng)后添加的成員與前添加的鍵名一樣時(shí)间涵,后添加的會(huì)覆蓋前添加的。
get
獲取成員榜揖,當(dāng)獲取不存在的成員時(shí)返回 undefined
Map 其他注意事項(xiàng)
Map 重復(fù)鍵名的判斷方式遵循全等原則勾哩,NaN例外。
Map 用途
當(dāng)你只需要鍵值對(duì)結(jié)構(gòu)時(shí)举哟,或者需要Map的方法時(shí)思劳,或者使用字符串以外的值做鍵時(shí)。
ES6其他新增技巧
對(duì)象字面量增強(qiáng)
- 屬性的簡(jiǎn)潔表示法:已定義的變量或常量妨猩,可以直接寫進(jìn)對(duì)象里當(dāng)其屬性潜叛,例如:
let name = 'mingzi';
let obj = {name}; //等同于let obj = {name:name}
obj.name //直接返回 'mingzi'
- 方法的簡(jiǎn)潔表示法:對(duì)象的方法可以省略冒號(hào)和 function 關(guān)鍵字,例如:
//const obj = { func : function(){} }
const obj = { func(){} }
- 方括號(hào)語(yǔ)法可以寫在對(duì)象字面量里,方括號(hào)可以注入變量值威兜,運(yùn)算值等销斟,例如:
let bianliang = 'x'
const obj = {
[bianliang] : 18;
}
obj.x //返回18
函數(shù)參數(shù)的默認(rèn)值
可以給函數(shù)的參數(shù)設(shè)置一個(gè)默認(rèn)值,例如:
function xjiay(x=1,y=2){
return x+y
}
xjiay()
//直接執(zhí)行不傳參數(shù)則使用默認(rèn)值
- 生效條件:不傳參或者傳的是undefined的時(shí)候椒舵,默認(rèn)值才會(huì)生效蚂踊。
- 同樣擁有惰性求值特性。
ES6 其他新增方法
ES6字符串新增方法
includes() 方法
用于判斷字符串是否有某些字符笔宿。
用法:第一個(gè)參數(shù)傳入的是一個(gè)值犁钟,返回布爾值判斷字符串內(nèi)是否有這個(gè)值。第二個(gè)參數(shù)表示開(kāi)始搜索的位置泼橘。
startsWith() 和 endsWith
用于判斷參數(shù)是否在字符串的頭部和尾部特纤,返回布爾值。
例如 abcd.startsWith('ab') 返回true侥加,abcd.endsWith('cd')返回true
repeat()
repeat() 方法返回一個(gè)新的字符串捧存,表示將源字符串重復(fù)n次。例如:
'rero'.repeat(4);
//輸出rerorerorerorero
參數(shù)如果不是整數(shù)會(huì)自動(dòng)向下取整担败,為0次則不輸出內(nèi)容昔穴,為負(fù)數(shù)則報(bào)錯(cuò)
padStart() 和 padEnd()
pad是填充的意思,用于補(bǔ)全字符串長(zhǎng)度提前,無(wú)法改變?cè)址?br> 用法:
- 第一個(gè)參數(shù)表示“需要補(bǔ)到的長(zhǎng)度”是多少吗货,通常是一個(gè)整數(shù)。
- 第二個(gè)參數(shù)表示“補(bǔ)入的值”狈网,如果不傳參數(shù)2宙搬,默認(rèn)使用空格代替。
- 如果第一個(gè)參數(shù)小于或等于原字符串長(zhǎng)度拓哺,則補(bǔ)全不生效勇垛,返回原字符串。
- 如果第二個(gè)參數(shù)補(bǔ)入的值長(zhǎng)度士鸥,補(bǔ)入后總長(zhǎng)度不滿足第一個(gè)參數(shù)闲孤,則循環(huán)再補(bǔ),補(bǔ)到滿足長(zhǎng)度烤礁。
- 如果第二個(gè)參數(shù)補(bǔ)入的值長(zhǎng)度讼积,補(bǔ)入后總長(zhǎng)度超過(guò)第一個(gè)參數(shù),則只補(bǔ)需要補(bǔ)的長(zhǎng)度脚仔,后面的截去勤众。
padStart() 是從頭部開(kāi)始補(bǔ), padEnd() 是從尾部開(kāi)始補(bǔ)鲤脏。例如:
'x'.padStart(5,'ab') //返回 'ababx'
'y'.padEnd(5,'6688') //返回 'y6688'
trimStart() 和 trimEnd()
trim是去掉不必要部分的意思们颜,用于清除字符串的首或尾的空格吕朵,中間的空格不會(huì)清除。
trimStart() 等同于 trimLeft() 掌桩,trimEnd() 等同于 trimRight()边锁。
同時(shí)去除頭尾空格的方法為 trim()。
matchAll()
matchAll() 方法返回一個(gè)正則表達(dá)式在當(dāng)前字符串的所有匹配
返回的是?個(gè)遍歷器(Iterator)波岛,?不是數(shù)組茅坛。
ES6數(shù)組新增方法
includes()
數(shù)組的 includes() 方法,可以判斷數(shù)組中是否含有某個(gè)成員则拷,判斷基于全等原則贡蓖,NaN除外。第一個(gè)參數(shù)傳入的是一個(gè)值煌茬,返回布爾值判斷數(shù)組內(nèi)是否有這個(gè)值斥铺。第二個(gè)參數(shù)表示開(kāi)始搜索的位置。
Array.from()
Array.from() 可以將 可迭代對(duì)象 和 類數(shù)組對(duì)象 轉(zhuǎn)換成數(shù)組坛善。
- 第一個(gè)參數(shù)表示的是要轉(zhuǎn)換的對(duì)象晾蜘。本來(lái)是什么類型的值,如果沒(méi)發(fā)生顯式或隱式類型轉(zhuǎn)換眠屎,轉(zhuǎn)換后數(shù)組的每個(gè)成員還是原來(lái)的類型剔交。
- 第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),用于將轉(zhuǎn)換后的數(shù)組內(nèi)的每一個(gè)成員進(jìn)行處理然后返回新數(shù)組改衩。例如
Array.from('01',(count)=>{return Boolean(count)})
將成員轉(zhuǎn)成布爾類型岖常。例如Array.from('12',(count)=>{return count*2})
將成員每個(gè)乘以2。 - 第三個(gè)參數(shù)指定/修改this指向
Array.of()
Array.of()方法用于將一組值轉(zhuǎn)化為數(shù)組葫督,即新建數(shù)組竭鞍,而不考慮參數(shù)的數(shù)量或類型。
//使?Array.of()創(chuàng)建數(shù)組
console.log(Array.of()); //[] 創(chuàng)建?個(gè)空數(shù)組
console.log(Array.of(8)); //[8] 創(chuàng)建只有?個(gè)元素值為8的數(shù)組 console.log(Array.of(1, 2, 3)); //[1,2,3] 創(chuàng)建?個(gè)值為1橄镜,2偎快,3的數(shù)組
//以前直接使?Array創(chuàng)建數(shù)組
console.log(Array()); //[] 創(chuàng)建?個(gè)空數(shù)組
console.log(Array(4)); // [ , , , ] 創(chuàng)建擁有4個(gè)元素空值的數(shù)組
console.log(Array(1, 2, 3)); //[1,2,3] 創(chuàng)建?個(gè)值為1,2蛉鹿,3的數(shù)組
find() 和 findIndex()
find() 方法找到滿足條件的第一個(gè)立即返回這個(gè)值滨砍。
findIndex() 方法找到滿足條件的第一個(gè)立即返回其索引。
- 第一個(gè)參數(shù)是一個(gè)回調(diào)函數(shù)妖异,回調(diào)函數(shù)的參數(shù)分別為 (1)可遍歷對(duì)象鍵值對(duì)的值 (2)可遍歷對(duì)像鍵值對(duì)的鍵 (3)可遍歷對(duì)像本身×熳罚可以在這個(gè)函數(shù)里指定規(guī)則他膳。
- 第二個(gè)參數(shù)是回調(diào)函數(shù)里面的 this 指向
some() 和 every()
ARR.every() 和 ARR.every() 目的:確定數(shù)組的所有成員是否滿足指定的測(cè)試
- some() 方法:只要其中一個(gè)為true 就會(huì)返回true。
- every() 方法:必須所有都返回true才會(huì)返回true绒窑,哪怕有一個(gè)false棕孙,就會(huì)返回false.
const data =[
{name:'zhangsan',age:22,sex:'man'},
{name:'lisi',age:25,sex:'woman'},
{name:'wangwu',age:23,sex:'man'},
];
//使?some判斷data中是否含有?條name以"wang"開(kāi)頭的
let s1 = data.some(v => v['name'].startsWith("wang"));
console.log(s1); //true
//使?every判斷data信息中是否都是age?于20的信息。
let s2 = data.every(v => v['age']>20);
console.log(s2); //true
若有?個(gè)不符合則返回false
fill()
ARR.fill() 函數(shù),使用指定的元素替換原數(shù)組內(nèi)容蟀俊,會(huì)改變?cè)瓉?lái)的數(shù)組钦铺。
參數(shù)一:要改變成的內(nèi)容;參數(shù)二:要改變的開(kāi)始位置肢预;參數(shù)三:要改變的結(jié)束位置矛洞。
//空數(shù)組則沒(méi)有替換
console.log([].fill(6)); //[]
//將數(shù)組中的值都替換成指定值6
console.log([1,2,3].fill(6));//(3) [6, 6, 6]
//從數(shù)組索引位置2開(kāi)始替換成指定值6,替換到數(shù)組結(jié)束位置烫映。
console.log([1,2,3,4,5].fill(6,2)); //(5) [1, 2, 6, 6, 6]
//從數(shù)組索引位置2開(kāi)始替換到索引位置4前結(jié)束沼本。
console.log([1,2,3,4,5].fill(6,2,4)); //(5) [1, 2, 6, 6, 5]
ES6對(duì)象新增方法
Object.assign()
Object.assign() 作用是合并對(duì)象
傳入的參數(shù)為多個(gè)對(duì)象。本質(zhì)是將后面參數(shù)的對(duì)象合并到第一個(gè)參數(shù)中锭沟,會(huì)改變第一個(gè)參數(shù)自身抽兆。如果不想改變?nèi)魏螀?shù),可以在第一個(gè)參數(shù)寫一個(gè)空對(duì)象族淮,例如: Object.assign({},obj1,obj2)
注意事項(xiàng):基本數(shù)據(jù)類型作為源對(duì)象時(shí)辫红,會(huì)先轉(zhuǎn)換成對(duì)象,再合并祝辣。合并時(shí)如果出現(xiàn)同名屬性贴妻,后面的會(huì)把前面的覆蓋。
Object.keys() 较幌、Object.values() 揍瑟、 Object.entries()
這三個(gè)方法都是Object構(gòu)造函數(shù)上的, 傳入的參數(shù)是一個(gè)對(duì)象乍炉,執(zhí)行后分別返回鍵名組成的數(shù)組绢片、值組成的數(shù)組、鍵值對(duì)組成的數(shù)組岛琼。
為什么返回的不是 可迭代對(duì)象 底循?因?yàn)?keys 是ES5的方法,ES5 中沒(méi)有 Iterator 的概念槐瑞,所以為了統(tǒng)一熙涤,Object 的這三個(gè)方法返回的都是數(shù)組。
Object.fromEntries()
是 Object.entries() 的逆操作困檩,將可迭代對(duì)象作參數(shù)傳入Object.fromEntries()中祠挫,會(huì)返回一個(gè)對(duì)象。
Object.is()
- ES5 ?較兩個(gè)值是否相等悼沿,只有兩個(gè)運(yùn)算符:相等運(yùn)算符(==)和嚴(yán)格相等運(yùn)算符(===)等舔。 它們都有缺點(diǎn),前者會(huì)?動(dòng)轉(zhuǎn)換數(shù)據(jù)類型糟趾,后者的NaN不等于?身慌植,以及+0等于-0甚牲。 JavaScript 缺乏?種運(yùn)算,在所有環(huán)境中蝶柿,只要兩個(gè)值是?樣的丈钙,它們就應(yīng)該相等。
- ES6 提出“Same-value equality”(同值相等)算法交汤,?來(lái)解決這個(gè)問(wèn)題雏赦。 Object.is就是部署這個(gè)算法的新?法。它?來(lái)?較兩個(gè)值是否嚴(yán)格相等蜻展,與嚴(yán)格?較運(yùn)算符 (===)的?為基本?致喉誊。
Object.is('foo', 'foo') // true
Object.is({}, {}) //false
+0 === -0 //true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
Object.getOwnPropertyDescriptors()
ES5 的Object.getOwnPropertyDescriptor()?法會(huì)返回某個(gè)對(duì)象屬性的描述對(duì)象 (descriptor)。 ES2017 引?了Object.getOwnPropertyDescriptors()?法纵顾,返回指定對(duì)象所有?身屬性(?繼承 屬性)的描述對(duì)象
const obj = { foo: 123, get bar() { return 'abc' } };
Object.getOwnPropertyDescriptors(obj);
// { foo:
// { value: 123,
// writable: true,
// enumerable: true,
// configurable: true },
// bar:
// { get: [Function: get bar],
// set: undefined,
// enumerable: true,
// configurable: true } }
伍茄、proto屬性,Object.setPrototypeOf()和Object.getPrototypeOf()
JavaScript 語(yǔ)?的對(duì)象繼承是通過(guò)原型鏈實(shí)現(xiàn)的施逾。ES6 提供了更多原型對(duì)象的操作?法敷矫。 具體詳??檔
Object.defineProperty
參數(shù)一:給誰(shuí)添加屬性
參數(shù)二:添加屬性的屬性名
參數(shù)三:配置項(xiàng),是一個(gè)對(duì)象汉额,其中包括value曹仗。
此方法定義的屬性默認(rèn)是不可枚舉/遍歷的,可在配置項(xiàng)里修改enumerable:true
開(kāi)啟遍歷蠕搜。
定于的屬性默認(rèn)是不可以被修改的怎茫,可在配置項(xiàng)修改 writable:true
開(kāi)啟修改
定義的屬性默認(rèn)是不可以被刪除的,可在配置項(xiàng)修改 configurable:true
開(kāi)啟刪除
類與對(duì)象
class (類)
- Javascript 的類妓灌,寫法為
class 類名{ }
注意沒(méi)有圓括號(hào)和分號(hào)轨蛤。
- 類也可以是匿名的,所以可以用表達(dá)式形式定義類
const 類名 =class{ }
-
type of 類
返回的也是一個(gè) function 虫埂,類里的方法本質(zhì)上也是相當(dāng)于寫在這個(gè) function 上的 prototype 上祥山,所以 class 是構(gòu)造函數(shù)的語(yǔ)法糖。
所以衍生出了“立即執(zhí)行類”掉伏,例如:
//加new因?yàn)閏onstructor必須要有new才能執(zhí)行缝呕。
(new class {
constructor(){
執(zhí)行語(yǔ)句;
}
})
constructor
class里的構(gòu)造方法 constructor 用法,如下:
class 類名{
constructor(參數(shù)1,參數(shù)2...參數(shù)n){
this.屬性名1 = 參數(shù)1;
this.屬性名2 = 參數(shù)2
}
}
- 構(gòu)造方法 constructor 里面的 this 直接指向?qū)嵗鰜?lái)的對(duì)象斧散。
- 構(gòu)造方法 constructor 里面一般不定義方法供常,只定義屬性,因?yàn)?constructor 里的方法會(huì)使每個(gè)實(shí)例都新生成一個(gè)自己的方法鸡捐,占用新內(nèi)存话侧。
- 所以共享的方法直接寫在類里即可,不用寫在 constructor 里面闯参,注意寫法瞻鹏,方法與方法之間沒(méi)有逗號(hào),直接寫
方法名(){ }
即可鹿寨,不用加function關(guān)鍵字新博,例如:
class 類名{
constructor(參數(shù)1,參數(shù)2...參數(shù)n){
this.屬性名1 = 參數(shù)1;
this.屬性名2 = 參數(shù)2
}
方法1 (){ }
方法2 (){ }
}
類的方法(靜態(tài)方法)
使用關(guān)鍵字 static ,寫在聲明里脚草,是只有類可以訪問(wèn)的赫悄,實(shí)例無(wú)法訪問(wèn),例如:
//static 靜態(tài)方法名(){}
class Lei{
static func(){
console.log('靜態(tài)方法')
}
}
Lei.func()
類的屬性(靜態(tài)屬性)
有三種方法:
- 類名.屬性名 = 值
- 聲明里寫 static 靜態(tài)方法(){return 值;}
- 聲明里直接寫 static 靜態(tài)屬性 = 值
方法3存在兼容性問(wèn)題馏慨,低版本瀏覽器不支持埂淮。
實(shí)例對(duì)象
如何創(chuàng)建一個(gè)實(shí)例:
new 類名();
即可生成一個(gè)實(shí)例對(duì)象,這個(gè)實(shí)例對(duì)象會(huì)擁有 class 里面的 constructor 的屬性写隶。例如
class Person{
constructor(a,b){
this.name = a;
this.age = b;
}
}
const student = new Person('ming',24);
這個(gè) student 就會(huì)擁有 name 和 age 屬性倔撞,屬性值是什么取決于你寫的是定值還是參數(shù)。
也可以給屬性值添加默認(rèn)值(截至2021年7月默認(rèn)值已失效)
JS 類與對(duì)象 的私有屬性和方法
想要實(shí)現(xiàn)私有慕趴,可以使用閉包實(shí)現(xiàn)痪蝇,或者利用模塊化。
class 繼承
使用關(guān)鍵字 extends 和關(guān)鍵字 super 冕房,例如:
class Person{
constructor(a,b){
this.name = a;
this.age = b;
}
func(){console.log(1)}
}
class Student extends Person{
}
此時(shí) Student 這個(gè)類就會(huì)擁有 Person 的所有構(gòu)造方法和共享方法躏啰。
子類如果想要擁有自己的構(gòu)造方法,則必須配合 super 關(guān)鍵字使用耙册,否則會(huì)報(bào)錯(cuò)给僵;
super 前面不能放任何this操作,否則報(bào)錯(cuò)详拙。例如
class Person{
constructor(a,b){
this.name = a;
this.age = b;
}
func(){console.log(this.name)}
}
class Student extends Person{
constructor(x,y,c){
super(x,y)
//這里super接收的參數(shù)會(huì)扔到父類的constructor中執(zhí)行帝际,this指向子類實(shí)例
this.newProp = c
}
}
子類想要使用父類的方法,子類調(diào)用的父類方法里的this指向的是父類溪厘,所以要在之類的構(gòu)造方法里使用super
class 中的 super 關(guān)鍵字
- 在構(gòu)造方法和一般方法中使用胡本,super 代表的都是父類的原型 SUPERCLASS.prototype
- 在靜態(tài)方法 static FUNCTION(){} 中使用,代表的是父類自身畸悬,this 指向子類侧甫。
- super 要么接點(diǎn)要么接括號(hào),否則瀏覽器會(huì)報(bào)錯(cuò)蹋宦。
class中的get和set
當(dāng)實(shí)例調(diào)用讀取父類方法時(shí)會(huì)觸發(fā)get方法披粟,get方法里面返回的值就是觸發(fā)后返回的值
當(dāng)實(shí)例修改父類方法時(shí)會(huì)觸發(fā)set方法,set方法必須帶有一個(gè)形參
class Phone{
get price(){
console.log('價(jià)格屬性被讀取了')
return 'iloveyou'
}
set price(newVal){
console.log('價(jià)格被修改了')
}
}
let s = new Phone()
console.log(s.price); //這里會(huì)觸發(fā)get price并得到里面的返回值
s.price = 'free'; //這里會(huì)觸發(fā)set
Module 模塊系統(tǒng)
模塊系統(tǒng)解決的主要問(wèn)題:
- 模塊化的問(wèn)題冷冗。
- 消除全局變量守屉。
- 管理加載順序。
import蒿辙、export拇泛、export default 和 script type='module'
- 只要你會(huì)用到 import 或 export 滨巴,在使用 script 標(biāo)簽加載的時(shí)候,就要使用
<script type='module'></script>
- 一個(gè)模塊如果沒(méi)有導(dǎo)出俺叭,也可以直接將其導(dǎo)入恭取,被導(dǎo)入的代碼都會(huì)執(zhí)行一遍,多次導(dǎo)入同一個(gè)模塊也只執(zhí)行一遍熄守,但無(wú)法使用模塊的東西蜈垮。
export default
export default 可以直接接模塊里的定變量名,類或類名裕照,方法或方法名等攒发。
- 注意一個(gè)模塊只能有一個(gè) export default
- 注意 export default 導(dǎo)出的東西是按語(yǔ)句順序執(zhí)行的,沒(méi)有提升晋南。
export default 的 import 直接寫導(dǎo)出的東西然后命名即可惠猿,名字可以隨便取。
export
export 導(dǎo)出可以有兩種形式搬俊。
- 接聲明或語(yǔ)句紊扬,例如
export let a = 'cosin'
- 接大括號(hào),例如
export {導(dǎo)出1,導(dǎo)出2}
export 的 import 只能用大括號(hào)接收唉擂,例如import{導(dǎo)出1,導(dǎo)出2}
如果導(dǎo)出或?qū)氲臇|西想改名稱餐屎,可以使用 as
關(guān)鍵字,例如:
export {name as newName} //此時(shí)import 接收的是 newName
import{newName as newnew}
import
import三種形式導(dǎo)入
- 通用形式導(dǎo)入玩祟,用as后接一個(gè)名字當(dāng)作接受的對(duì)象
import * as m1 from './js/m1.js'
console.log(m1.name)
m1.fn()
- 解構(gòu)賦值形式導(dǎo)入
import {name,fn} from './js/m1.js'
import {name as mingzi,fn as fangfa} from './js/m2/js'
import {default as mod} from './js/m3.js'
- 簡(jiǎn)便形式 僅針對(duì) export deafault 默認(rèn)暴露
import m3 from './js/m3.js'
同時(shí)導(dǎo)入
因?yàn)?export 和 export default 的導(dǎo)入方式不同腹缩,所以想一次導(dǎo)入這兩種導(dǎo)出,可以使用:
import default導(dǎo)出的,{非default導(dǎo)出} from '路徑'
- 采用整體導(dǎo)入空扎,使用通配符 * 星號(hào)然后接 as 然后接一個(gè)名字藏鹊,就代表導(dǎo)入所有導(dǎo)出的,包括 export 和 export default 的转锈,例如:
import * as obj from './module.js'
導(dǎo)入的內(nèi)如是一個(gè) Module 對(duì)象盘寡,導(dǎo)出的東西都會(huì)變成這個(gè) Module 對(duì)象的屬性茎截,default 的內(nèi)容會(huì)變成 default 屬性
Module 注意事項(xiàng)
- 導(dǎo)入的變量是只讀的扼脐,導(dǎo)入的對(duì)象的屬性值可以修改。
- 一個(gè)模塊可以直接寫export软棺,即導(dǎo)入后直接導(dǎo)出砌溺,此時(shí)這個(gè)模塊不可以使用導(dǎo)入的任何東西影涉,相當(dāng)于一個(gè)中轉(zhuǎn)站。
- import 和 export 命令具有提升效果规伐,會(huì)提升到整個(gè)模塊的頭部并率先執(zhí)行蟹倾。所以 import 和 export 別寫在代碼塊中,想要按條件導(dǎo)入,可以使用 import() 函數(shù)鲜棠。
- 模塊頂層的 this 指向 undefined 肌厨,可以利用這點(diǎn)提示使用模塊加載,例如:
if(type of this !== 'undefined'){
throw new Error('請(qǐng)使用模塊加載')
}
ES6 數(shù)值拓展
Number.EPSILON
Number.EPSILON是 Javascript表示的最小進(jìn)度岔留,可以用來(lái)做浮點(diǎn)運(yùn)算判斷 夏哭、
fuction equal(a,b){
if(Math.abs(a-b)<Number.EPSILON){
return true;
}else{
return false;
}
}
console.log(equal(0.1+0.2,0.3))
Number.isFinite 檢測(cè)一個(gè)數(shù)值是否為有限數(shù)
console.log(Number.isFinite(100))
Number.isNaN
isNaN舊方法扔進(jìn)Number中
Math.trunc()
將數(shù)字(參數(shù))的小數(shù)部分抹掉
Math.sign()
判斷參數(shù)是正數(shù)、負(fù)數(shù)献联、還是0
直接書寫N進(jìn)制數(shù)字
let b = 0b1010
let o = 0o777
ES7 新特性
includes
可以檢測(cè)數(shù)組是否擁有該組員
兩個(gè)星號(hào)(乘號(hào))
兩個(gè)星號(hào)后面接的數(shù)字代表幾次方,2 ** 10 類似于 Math.pow(2,10)
ES8
async 函數(shù)
在函數(shù)前面加上 async 關(guān)鍵字
async function fn(){
}
async函數(shù)返回結(jié)果是一個(gè)promise何址,返回的promise狀態(tài)由內(nèi)容決定
- 如果返回的東西是一個(gè)Promise對(duì)象里逆,則由該promise決定成功還是失敗
- 如果返回結(jié)果是拋出一個(gè)錯(cuò)誤,則狀態(tài)為失敗reject用爪,例如 throw new Error('err')
- 其他返回結(jié)果大多為成功resolve/fulfilled
await
- await 要放在 async 函數(shù)中
- await 右側(cè)的表達(dá)式一般為 promise 對(duì)象
- await 返回的是 promise 成功的值
- await 的 promise 失敗了原押,就會(huì)拋出異常,需要使用 try{}catch{} 捕獲
ES9
正則捕獲分組
?<>
方向斷言
?<=
dotAll 拓展
結(jié)尾加上s
ES10
數(shù)組拓展 flat
將多維數(shù)組轉(zhuǎn)化為低維數(shù)組
ARR.flat()
參數(shù)是數(shù)字偎血,意義為展開(kāi)深度為幾層诸衔,例如三維轉(zhuǎn)一維,深度就是3-1=2
數(shù)組拓展 flatMap
如果數(shù)組使用map之后返回一個(gè)多元數(shù)組颇玷,flatMap則是把多元數(shù)組變回一維數(shù)組笨农,
ARR.flatMap() 就是數(shù)組的map方法和flat方法結(jié)合
Symbol.prototype.description
let sb = Symbol('HQM')
sb.description
ES11
對(duì)象的私有屬性
在屬性前面加上井號(hào)
class Person{
name;
#age;
#weight;
constructor(name,age,weght){
this.name = name;
this.#age = age;
this.#weight = weight;
}
}
const girl = new Person('hong',18,'45kg')
console.log(girl.#age) //此時(shí)會(huì)報(bào)錯(cuò),私有屬性不能在外部直接訪問(wèn)帖渠,可以在類定義一個(gè)內(nèi)部方法通過(guò)內(nèi)部方法訪問(wèn)
Promise.allSettled
- Promise.all 是有一個(gè)失敗則直接返回失敗谒亦。
- 而 Promise.allSettled 是無(wú)論成功還是失敗都會(huì)把所有參數(shù)里的Promise全部執(zhí)行完再返回結(jié)果。結(jié)果都是成功
- Promise.allSettled() 和 Promise.all() 的參數(shù)都是一個(gè)可迭代對(duì)象(通常為數(shù)組)
可選鏈操作符
?.
當(dāng)一個(gè)函數(shù)的參數(shù) 是一個(gè)對(duì)象的時(shí)候空郊,如果要找傳入的對(duì)象是否有這個(gè)值份招,一般需要層層判斷,有了可選鏈操作符狞甚,直接使用 ?. 即可锁摔,不會(huì)報(bào)錯(cuò)
const fn = (config) => {
console.log(config.db.a1);
}
fn({
db: {
a1: '111',
a2: '222'
}
})
//如果有這個(gè)參數(shù)則不會(huì)報(bào)錯(cuò)
const fn = (config) => {
console.log(config.db.a1);
}
fn()
//如果沒(méi)有這個(gè)參數(shù)則報(bào)錯(cuò),只能使用 config&&config.db&&config.db.a1
有了可選鏈操作符哼审,只需要這樣即可
console.log(config?.db?.a1)
動(dòng)態(tài)import
主要用來(lái)提升性能谐腰,動(dòng)態(tài)import就是不在文件頭部使用import導(dǎo)入模塊,而是使用import()這個(gè)函數(shù)在使用的時(shí)候才導(dǎo)入棺蛛,函數(shù)的參數(shù)就是導(dǎo)入這個(gè)模塊的路徑怔蚌。
導(dǎo)入執(zhí)行之后返回的是一個(gè)Promise,用then后的回調(diào)函數(shù)的參數(shù)接收此模塊
BigInt() 大整數(shù)
在整數(shù)后面加一個(gè)字母n旁赊,就是大整型數(shù)據(jù)類型
let bi = 521n
console.log(bi,typeof bi)
使用 BigInt() 方法桦踊,往里面穿一個(gè)整型數(shù)字,就會(huì)轉(zhuǎn)變?yōu)榇笳蛿?shù)字
let norm = 123
console.log(BigInt(norm))
運(yùn)用場(chǎng)景是大數(shù)值運(yùn)算终畅,BigInt不能和普通Int做運(yùn)算
let max = Number.MAX_SAFE_INTEGER
console.log(max)
console.log(max+1)
console.log(max+2)
//此時(shí)就會(huì)計(jì)算丟失精度
console.log(BigInt(max))
console.log(BigInt(max)+BigInt(1))
console.log(BigInt(max)+BigInt(2))
//使用BigInt之后就沒(méi)有問(wèn)題