背景介紹
在之前的高級(jí)篇已經(jīng)給出了ES6在函數(shù)方法和循環(huán)上做的的優(yōu)化和改變,那最后這一篇就來給ES6的新特性畫上一個(gè)圓滿的句號(hào)吧:),基礎(chǔ)篇,進(jìn)階篇,高級(jí)篇的傳送門:
ECMAScript 6重點(diǎn)一覽——基礎(chǔ)篇
特性重點(diǎn)
一、【重點(diǎn)】Set和Map數(shù)據(jù)結(jié)構(gòu)
ES6終于有了Set和Map,當(dāng)年苦苦在搜索引擎查如何用JS實(shí)現(xiàn)Map的初學(xué)開發(fā)者們應(yīng)該要眼眶濕潤(rùn)了:
// set
let set =new Set( ['red','green','blue'] );
for(let x of set) { console.log(x); }
// map
let map =new Map( [? ['F','no'],? ['T','yes'] ] );
for( let [key, value] of map) { console.log(key, value); }
二、【重點(diǎn)】Generator 函數(shù)
說實(shí)話,Generator函數(shù)應(yīng)該整個(gè)ES6中最難理解,最抽象的一部分了。很多搜索出來的定義和解釋都相當(dāng)不接地氣,相信初學(xué)的人搜索后都會(huì)一臉懵逼。其實(shí),如果從ES6的大方向和設(shè)計(jì)目標(biāo)上分析,就好理解的多。
首先ES6除了更方便的語(yǔ)法和更多的實(shí)用功能,也是在為JS工程化,模塊化,甚至更直接點(diǎn)說就是為了構(gòu)建大型系統(tǒng)架構(gòu)做努力。受限制于腳本,而且初期設(shè)計(jì)不佳,一直以來這樣的目標(biāo)都難以實(shí)現(xiàn)。而且JS單線程的特性,使得高并發(fā)的處理需求,不得不通過大量的回調(diào)機(jī)制來“曲線救國(guó)”,對(duì),我這里要用的就是這個(gè)詞。
雖然Node以異步回調(diào)高性能著稱,但是這背后卻是一種無可奈何,更多的還是一種宣傳上的妥協(xié),如果Node能完美用多線程,今天的發(fā)展一定更猛,完全超越Java也不是夢(mèng)?。?!
先說說為什么回調(diào)機(jī)制成為了限制JS發(fā)展的一大因素。其實(shí)異步回調(diào)機(jī)制不是什么新鮮的產(chǎn)物,更不是什么劃時(shí)代的新技術(shù),早在C語(yǔ)言的時(shí)代,就已經(jīng)有了——函數(shù)指針。將函數(shù)指針作為參數(shù)傳遞,就是異步回調(diào)?;卣{(diào)的確是不阻塞,而且性能更好。
但是回調(diào)也有巨大的缺陷——就是寫法上復(fù)雜,并且不符合人類的邏輯思維!是的,回調(diào)并不符合人類的邏輯思維,這也是為什么回調(diào)學(xué)習(xí)曲線特別陡峭的原因。這個(gè)世界是異步的,但人的思想是同步的。人希望異步地處理事情,例如開一家公司,有大大小小許多的事情去做,BOSS希望的是雇一群?jiǎn)T工去做,而不是雇一群助理來通知自己什么時(shí)候該做什么事情。
Node的回調(diào)機(jī)制本質(zhì)上是一種事件消息模型的設(shè)計(jì)模式的應(yīng)用,通知你去做一件事情,但是我不必等你做完,而是等你完成了再來告訴我。Node非常極端,幾乎全是異步回調(diào)。這樣帶來的問題就是當(dāng)有同步需求的時(shí)候,很難滿足。從而github上就產(chǎn)生了許許多多的流程控制框架,各種號(hào)稱能完美解決異步流程的東西產(chǎn)生。
從來沒有一門編程語(yǔ)言是需要專門的流程控制框架,流程管理工具等去協(xié)助處理“流程”的,因?yàn)檫@是一種諷刺不是么。。。所謂“編程”本質(zhì)就是在表達(dá)人類的思維。如果這一門語(yǔ)言不能很好地表達(dá)人類思維,而是需要帶上一個(gè)助聽器,擴(kuò)音器才行,那這又有什么意義?
雖然看到可能很多的人會(huì)反駁我,說多線程Out了,異步回調(diào)一點(diǎn)不比多線程差等等。當(dāng)然,一千個(gè)讀者心中就由一千個(gè)哈姆雷特,在此我不做過多辯解。但是我的觀點(diǎn)還是多線程才是處理高并發(fā),高性能更好的解決方案,異步回調(diào)可以作為補(bǔ)充,但絕對(duì)不是到影響了同步思維,同步流程的地步。現(xiàn)實(shí)中同步需求一點(diǎn)不比異步需求少,相反可能更多。我堅(jiān)信Node未來一定會(huì)完美實(shí)現(xiàn)多線程。
好的,跑偏了,繼續(xù)說回Generator 函數(shù),它的推出,是ES6為解決異步回調(diào)帶來的嵌套式寫法噩夢(mèng)。這里用大白話解釋,不說玄乎的話語(yǔ)——Generator 函數(shù)就是一個(gè)能控制自己運(yùn)行流程的機(jī)制。后端的開發(fā)者們應(yīng)該會(huì)有了解,這不就是——狀態(tài)機(jī)嗎?
是的,這又是一種設(shè)計(jì)模式了。沒錯(cuò),因?yàn)楫惒交卣{(diào)實(shí)在太難搞了,如果不再語(yǔ)言層面提供解決方案,恐怕以后JS的代碼就越來越難維護(hù)。所以ES6推出了Generator 函數(shù),下面來看看它的真面目:
function* helloWorldGenerator(){ yield 'hello'; yield 'world';}
var hw= helloWorldGenerator();
hw.next() // { value: 'hello', done: false }
hw.next() // { value: 'world', done: false }
通過星號(hào)*定義,使用yield來控制流程,每執(zhí)行一次next前進(jìn)一步,非常典型的流程狀態(tài)控制。
三、【重點(diǎn)】Promise對(duì)象
ES6原生提供了Promise對(duì)象?!八^Promise對(duì)象,就是代表了未來某個(gè)將要發(fā)生的事件”。這里我翻譯一下,其實(shí)Promise也是因?yàn)楫惒交卣{(diào)嵌套太多,導(dǎo)致邏輯深入不可自拔引發(fā)JS發(fā)展瓶頸,從而產(chǎn)生的解決方案。本質(zhì)就是同步流程語(yǔ)言的返回值。上一步結(jié)果出參作為下一步入?yún)?/b>,可以寫出鏈?zhǔn)斤L(fēng)格的代碼來代表同步邏輯。
getJSON("/post/1.json").then( function(post) {
return getJSON(post.commentURL);?
})
.then( function(comments){
// 對(duì)comments進(jìn)行處理
});
四、【重點(diǎn)】Class和Module
class Point{
constructor(x, y) { this.x = x; this.y = y; }??
toString() { return'('+this.x+', '+this.y+')'; }
}
面向?qū)ο笳Z(yǔ)法糖,有了它,定義類,寫對(duì)象就更簡(jiǎn)單了。
最后就是模塊構(gòu)建了,這么多年了JS竟然都沒有模塊構(gòu)建,也是逼得社區(qū)誕生了CommonJS和AMD。ES6的模塊構(gòu)建包含兩個(gè)命令,import和export(有導(dǎo)出才有導(dǎo)入)。
export {firstName, lastName, year}; // profile
import {firstName, lastName, year} from'./profile';
如果想要輸出匿名函數(shù),可以使用export default命令
export default function(){ console.log('foo'); }// export-default
import customName from'./export-default';
customName();// 'foo'
總結(jié)
這最后的一章基本上都是ES6對(duì)異步流程控制,優(yōu)化代碼邏輯做出的努力,這些努力很多也將會(huì)成為ES7的基礎(chǔ),例如生成器函數(shù)之后的async...await...。不過不管怎么樣,還是非常期待未來JavaScript對(duì)多線程的支持,能夠在同步和異步的取舍上達(dá)到一個(gè)平衡,任何事情,走極端了總是不好。ES6重點(diǎn)系列的文章在這就告一段落,后續(xù)我個(gè)人還會(huì)持續(xù)在簡(jiǎn)書上寫各類的技術(shù)文章,也算是作為我個(gè)人點(diǎn)滴的積累吧。
本文基于阮一峰的ECMAScript 6 系列文章和眾多網(wǎng)絡(luò)散文資料匯聚。在此給出原文鏈接,上面給出的重點(diǎn)一覽,都可以在下面鏈接找到更為詳盡的講解:
如果有任何的批評(píng)建議,BUG反饋,問題反饋,或是想法建議,幫助支持,個(gè)人都十分歡迎,我個(gè)人的聯(lián)系方式如下:)
作者:cheneyxu
郵箱:457299596@qq.com
QQ:457299596
關(guān)于:XServer官網(wǎng)