前言
ES6較ES5來(lái)說(shuō)可能是一個(gè)較大的版本變動(dòng),增添了很多特性或者語(yǔ)法糖雏搂,使得整個(gè)JS語(yǔ)言的使用體驗(yàn)又向前邁了一大步画饥,但是ES6(ECMAScript2015)之后,每一年都會(huì)有新的語(yǔ)言強(qiáng)化版本更新出現(xiàn),所謂的ES7等贼邓,這些變動(dòng)都沒(méi)有再像ES6那么多阶冈。加之很多新特性在正式發(fā)布之前就一定會(huì)至少有兩個(gè)成熟的實(shí)現(xiàn)支持,使得在ES6之后塑径,新增特性版本上就變得很模糊了女坑,尤其是在Node環(huán)境中,有些時(shí)候?qū)τ谝恍┬〉牡胤降男绿匦阅愣家呀?jīng)寫(xiě)了很多次了都有可能不知道用的到底是哪個(gè)版本了统舀。
我本地和開(kāi)發(fā)環(huán)境都已經(jīng)遷移和更新到了Node的最新LTS版本8.9.4對(duì)新版本的語(yǔ)法支持都做得已經(jīng)很好了匆骗,以下特性雖然歸在ES6之后的版本,但是Node已經(jīng)有了支持誉简。而對(duì)于語(yǔ)言的新語(yǔ)法特性來(lái)說(shuō)碉就,個(gè)人認(rèn)為最好的方式就是理解語(yǔ)言重要部分之外多關(guān)注語(yǔ)言,然后多積累吧闷串。所以我把這篇文章當(dāng)做是一個(gè)對(duì)ES6之后的語(yǔ)法的一些“小地方”的一個(gè)筆記瓮钥,記錄積累那些小的特性或者語(yǔ)法,當(dāng)然一些重要的地方比如說(shuō)像共享內(nèi)存和原子操作等這種烹吵,感覺(jué)內(nèi)容很多的塊就不會(huì)在這里記了碉熄。
以前剛學(xué)PY的時(shí)候覺(jué)得python中的裝飾器這種這么騷氣的語(yǔ)法糖為啥JS不弄一個(gè),結(jié)果一查JS的Decorator(裝飾器)草案已經(jīng)提出了肋拔。
不管是哪一款優(yōu)秀的開(kāi)源框架還是哪一門(mén)優(yōu)秀并且開(kāi)發(fā)者使用的多的語(yǔ)言锈津,往前發(fā)展都會(huì)對(duì)其他優(yōu)秀的框架語(yǔ)言進(jìn)行借鑒,這種看似競(jìng)爭(zhēng)實(shí)則攜手發(fā)展的面貌對(duì)于開(kāi)發(fā)者來(lái)說(shuō)本身就是一份回饋也是一份督促凉蜂。
開(kāi)始
-
**
表示乘方
console.log(2**3)//輸出8
- Trailing commas(函數(shù)參數(shù)的尾逗號(hào))
之前數(shù)組的最后一個(gè)元素和對(duì)象的最后一個(gè)屬性后面都可以加逗號(hào)琼梆,現(xiàn)在函數(shù)的最后一個(gè)參數(shù)后面可以加逗號(hào)了
function f(
a,
b,
)
- 數(shù)組新增了
includes()
方法
在之前判定數(shù)組中是否包含某個(gè)元素的方式是indexOf,返回值如果是-1則表示沒(méi)有包含,現(xiàn)在用[].includes(ele)
返回值為Bollean可以判斷是否包含了窿吩。
let a = [1,2,3]
a.includes(1)//返回值為true
a.includes(4)//返回值為false
-
str.padStart()
和str.padEnd()
字符串新增了兩個(gè)方法茎杂,參數(shù)是number,表示當(dāng)字符串的長(zhǎng)度達(dá)不到方法的參數(shù)的長(zhǎng)度時(shí)在末尾或者開(kāi)頭用空格補(bǔ)齊長(zhǎng)度
let b = 'abc'
b.padStart(5)//返回值為' abc'
b.padEnd(5)//返回值為'abc '
- 對(duì)象的Rest&Spread
對(duì)于數(shù)組的REST和Spread已經(jīng)是經(jīng)常用的了爆存,對(duì)于對(duì)象的屬性的Rest和Spread與之類(lèi)似
let {x,y,...z}={x:1,y:2,z:3,d:4}
console.log(x)//1
console.log(z)//輸出{ z: 3, d: 4 }
let n = {x,y,...z}
console.log(n)//輸出{x:1,y:2,z:3,d:4}
-
Object.values(obj)
和Object.entries(obj)
在ES5引入了遍歷對(duì)象key的方法Object.keys(obj)
之后再ES8新增了新的對(duì)應(yīng)遍歷對(duì)象值的方法蛉顽。三者的返回值都是數(shù)組。
Object.values(obj)
返回的是對(duì)應(yīng)的value數(shù)組
let obj = {a:1,b:2}
Object.values(obj)//輸出[ 1, 2 ]
for (let value of Object.values(obj)) {
console.log(value); // 1, 2
}
Object.entries(obj)
返回的是有每一對(duì)鍵值對(duì)數(shù)組組成的數(shù)組先较。
let obj = {a:1,b:2}
Object.entries(obj)//輸出[ [ 'a', 1 ], [ 'b', 2 ] ]
for (let [key, value] of Object.entries(obj)) {
console.log([key, value]); // ['a', 1], ['b', 2]
}
-
Object.getOwnPropertyDescriptors(obj)
獲取屬性信息
由之前的Object.getOwnPropertyDescriptor(obj,'propName')
而來(lái)返回的是對(duì)象所有屬性的描述信息,返回值是一個(gè)對(duì)象携冤。
let a = {x:1,y:1,z:2}
Object.getOwnPropertyDescriptors(a)
||輸出值
\/
{ x: { value: 1, writable: true, enumerable: true, configurable: true },
y: { value: 1, writable: true, enumerable: true, configurable: true },
z: { value: 2, writable: true, enumerable: true, configurable: true } }
====================================================
Object.getOwnPropertyDescriptors(a,'x')
||輸出值
\/
{ value: 1, writable: true, enumerable: true, configurable: true }
補(bǔ)充:
ES5開(kāi)始對(duì)象的屬性都具備了屬性描述符
Object.defineProperty
定義對(duì)象屬性
Object.defineProperty( myObject, "a", {
value: 2,
writable: true,
configurable: true,
enumerable: true
} );
說(shuō)明:
writable:是否可寫(xiě);即值是不是能被set變闲勺,嚴(yán)格模式下修改writable:false的屬性值是會(huì)拋出錯(cuò)誤
Configurable是否可用Object.defineProperty來(lái)配置曾棕,改為false之后則不管是不是嚴(yán)格模式下在想來(lái)修改屬性描述都會(huì)拋出錯(cuò)誤,并且被修改為不可配置的這個(gè)屬性不能用delete myObject.a 這種方式刪掉
Enumerable控制的是屬性是否會(huì)出現(xiàn)在對(duì)象的屬性枚舉中菜循,比如for..in 循環(huán)(但是可以通過(guò) in 操作符來(lái)判斷是否存在)翘地,“可枚舉”相當(dāng)于“可以出現(xiàn)在對(duì)象的屬性遍歷中”判斷是否可枚舉myObject.propertyIsEnumerable( "a" );
關(guān)于in 和 obj.hasOwnProperty()
in 操作符會(huì)檢查屬性是否在對(duì)象及其 Prototype 原型鏈中。相比之下, hasOwnProperty(..) 只會(huì)檢查屬性是否在 myObject 對(duì)象中衙耕,不會(huì)檢查 Prototype 鏈昧穿。
- Async&Await
異步的“終極解決方案”,已經(jīng)是很常用的東西了橙喘,在這里就不過(guò)多介紹了时鸵。
由于Node的主場(chǎng)景(網(wǎng)絡(luò)IO和文件IO)和JS的語(yǔ)言特性,異步的處理一直都是一個(gè)很大的一塊厅瞎,所以關(guān)于異步的總結(jié)我會(huì)盡快梳理成一篇完整的博客饰潜。
后續(xù)
后續(xù)會(huì)有更新和補(bǔ)充。
關(guān)于學(xué)習(xí)和簸,語(yǔ)法這種事情最好的方式就是自己多有意識(shí)的多用幾次彭雾,這樣遇到符合使用場(chǎng)景的時(shí)候就會(huì)可以想到,哪怕細(xì)節(jié)記得不清了也可以很快解決锁保。由于平時(shí)主要在Node端寫(xiě)代碼所以測(cè)試語(yǔ)法最快的方式就是在node REPL中敲一遍薯酝,加深了印象也得到了結(jié)果,當(dāng)然有一個(gè)方便查看的表也是很重要的ECMAScript compatibility table