通趁瓤瘢看作js的標(biāo)準(zhǔn)化規(guī)范潭千,實(shí)際上js是ES的擴(kuò)展語言,ES只提供了最基本的語法衩侥,但僅停留在語言層面国旷。
ES2015(ES6)
最新ES標(biāo)準(zhǔn)的代表版本。
- 相比于ES5.1的變化較大茫死;
- 自此跪但,標(biāo)準(zhǔn)命名規(guī)則發(fā)生變化;
- ES6也可以泛指2015之后的所有新標(biāo)準(zhǔn)峦萎,因此需要區(qū)別泛指和特指屡久。
let與塊級作用域
- ES2015新增了塊級作用域,在此之前只有全局作用域和函數(shù)作用域爱榔;
-
for
循環(huán)有兩層嵌套的作用域被环,循環(huán)體內(nèi)的變量是內(nèi)層獨(dú)立的作用域,不會被for
循環(huán)本身的作用域影響详幽; -
let
沒有變量提升筛欢。
const
聲明后不允許被修改(不能重新指向一個新的內(nèi)存地址,并非不能修改恒量中的屬性成員)唇聘。
??最佳實(shí)踐:不用var
版姑,主用const
,配合let
迟郎。
解構(gòu)
- 數(shù)組的解構(gòu)
- 位置一一對應(yīng)剥险,逗號不可省略;
- 剩余元素用
...res
宪肖,只能放在解構(gòu)的最后位置表制; - 超出部分為
undefined
; - 可以用
=
設(shè)置默認(rèn)值控乾。
- 對象的解構(gòu)
- 使用鍵值對應(yīng)對象中的屬性名么介;
- 可以用
:
重命名。
模范字符串
- 支持換行阱持;
- 使用
${}
嵌入變量; - 在模板字符串之前添加一個標(biāo)簽魔熏,這個標(biāo)簽實(shí)際上是一個特殊的函數(shù)衷咽,意味調(diào)用這個函數(shù),能夠?qū)δ0遄址M(jìn)行加工蒜绽,實(shí)現(xiàn)文本的多元化镶骗、中英文翻譯、檢查不安全字符躲雅、實(shí)現(xiàn)小型等模板引擎等鼎姊。
字符串的擴(kuò)展方法:
- includes()
- startsWith()
- endsWith
參數(shù)默認(rèn)值
直接用=
后面接默認(rèn)值,帶有默認(rèn)值的參數(shù)需要放到最后。
...操作符
- 接收剩余參數(shù)相寇,放在形參的最后慰于;
- 展開數(shù)組,簡化操作唤衫。
const arr = ['foo', 'bar', 'baz']
console.log.apply(console, arr)
console.log(...arr)
箭頭函數(shù)與this
箭頭函數(shù)中沒有this
的機(jī)制婆赠,不會改變箭頭函數(shù)的指向。
const person = {
name: 'tom',
// sayHi: function () {
// console.log(`hi, my name is ${this.name}`)
// }
sayHi: () => {
console.log(`hi, my name is ${this.name}`) // undefined
},
sayHiAsync: function () {
// const _this = this
// setTimeout(function () {
// console.log(_this.name)
// }, 1000)
console.log(this)
setTimeout(() => {
// console.log(this.name)
console.log(this)
}, 1000)
}
}
person.sayHiAsync()
對象字面量的增強(qiáng)
- 變量名如果和屬性名相同佳励,可以省略冒號休里;
- 給對象添加函數(shù),可以省略冒號和function赃承;
- 添加計算屬性名妙黍,在[]內(nèi)部可以添加任意表達(dá)式作為這個對象的屬性名。
對象擴(kuò)展方法
- Object.assign
將多個源對象中的屬性復(fù)制到一個目標(biāo)對象中瞧剖。
- Object.is
可以區(qū)分+0
和-0
拭嫁,NaN
也等于NaN
。
Proxy(代理對象)
// Proxy 對象
const person = {
name: 'zce',
age: 20
}
const personProxy = new Proxy(person, {
// 監(jiān)視屬性讀取
get(target, property) {
return property in target ? target[property] : 'default'
},
// 監(jiān)視屬性設(shè)置
set(target, property, value) {
if (property === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError(`${value} is not an int`)
}
}
target[property] = value
}
})
- 對比Object.defineProperty()
- defineProperty只能監(jiān)視屬性的讀寫筒繁,Proxy能監(jiān)視更多的對象操作噩凹;
- Proxy更好的支持?jǐn)?shù)組對象的監(jiān)視;
- Proxy是以非侵入的方式監(jiān)管了對象的讀寫毡咏。
Reflect
統(tǒng)一提供一套用于操作對象的API驮宴。
Reflect屬于一個靜態(tài)類,內(nèi)部封裝了一系列對對象的底層操作呕缭。Reflect成員方法就是Proxy處理對象的默認(rèn)實(shí)現(xiàn)堵泽。
Promise
一種更優(yōu)的異步編程解決方案,解決了傳統(tǒng)異步編程中回調(diào)函數(shù)嵌套過深的問題恢总。
class類
- 靜態(tài)方法
靜態(tài)方法是掛載到類型上面的迎罗,所以在靜態(tài)方法內(nèi),this就不會指向某個實(shí)例對象片仿,而是當(dāng)前的類型
新增的數(shù)據(jù)結(jié)構(gòu)
-
Set(集合)
內(nèi)部不允許重復(fù)纹安,常用于數(shù)組去重。- .size():返回集合長度
- .add():向集合中添加元素
- .has():判斷集合中是否有某值
- .delete():刪除集合中的值
- .clear():清空集合
-
Map(鍵值對集合)
- 與對象的區(qū)別砂豌,可以使用任意類型的值作為對象的鍵
-
Symbol
表示一個獨(dú)一無二的值厢岂。
- 可以作為對象的鍵,可用于避免對象屬性名重復(fù)的問題阳距;
- 可以模擬實(shí)現(xiàn)對象的私有成員塔粒;
- .for()可以接收一個字符串,如果傳參非字符串也會被轉(zhuǎn)換成字符串筐摘,維護(hù)的是字符串和Symbol的對應(yīng)關(guān)系卒茬;
- .toStringTag是一個內(nèi)置的Symbol常量晴弃;
- Object.getOwnPropertySymbols獲取到對象中類型為Symbol的屬性名饰豺。
for ... of循環(huán)
以后會作為遍歷所有數(shù)據(jù)結(jié)構(gòu)的統(tǒng)一方式。
- 可以使用
break
關(guān)鍵字隨時終止循環(huán); - 實(shí)現(xiàn)可迭代接口是for ... of的前提轮听。
可迭代接口
// 實(shí)現(xiàn)可迭代接口Iterable
const obj = {
store: ['foo', 'bar', 'baz'],
[Symbol.iterator]: function () {
const self = this
let index = 0
return {
next: function () {
const result = {
value: self.store[index],
done: index >= self.store.length
}
index++
return result
}
}
}
}
- 迭代器設(shè)計模式:對外提供一個統(tǒng)一的接口去团,讓外部無需關(guān)心內(nèi)部的結(jié)構(gòu)掉弛。
generator
生成器函數(shù)會返回一個生成器對象搅幅,調(diào)用這個對象的next方法可以讓這個函數(shù)開始執(zhí)行,一旦遇到y(tǒng)ield堪置,函數(shù)執(zhí)行就會被暫停躬存,同時yield后面的值會作為next的結(jié)果返回。
ES2016概述
- 數(shù)組新增includes方法舀锨;
- 新增指數(shù)運(yùn)算符
**
岭洲。
ES2017概述
- Object.values():返回對象中所有的值;
- Object.entries():返回對象中所有的鍵值對坎匿;
- Object.getOwnPropertyDescriptors():獲取對象中的完整描述信息盾剩;
- String.padStart()/String.padEnd():用給定的字符串填充目標(biāo)字符串的開始或結(jié)束位置知道這個字符串達(dá)到制定長度為止;
- 在函數(shù)參數(shù)中添加尾逗號替蔬。