ECMAScript 6重點(diǎn)一覽——完結(jié)篇

背景介紹

在之前的高級(jí)篇已經(jīng)給出了ES6在函數(shù)方法和循環(huán)上做的的優(yōu)化和改變,那最后這一篇就來給ES6的新特性畫上一個(gè)圓滿的句號(hào)吧:),基礎(chǔ)篇,進(jìn)階篇,高級(jí)篇的傳送門:

ECMAScript 6重點(diǎn)一覽——基礎(chǔ)篇

ECMAScript 6重點(diǎn)一覽——進(jìn)階篇

ECMAScript 6重點(diǎn)一覽——高級(jí)篇

特性重點(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)一覽,都可以在下面鏈接找到更為詳盡的講解:

ECMAScript 6入門——阮一峰

如果有任何的批評(píng)建議,BUG反饋,問題反饋,或是想法建議,幫助支持,個(gè)人都十分歡迎,我個(gè)人的聯(lián)系方式如下:)

作者:cheneyxu

郵箱:457299596@qq.com

QQ:457299596

關(guān)于:XServer官網(wǎng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 異步編程對(duì)JavaScript語(yǔ)言太重要。Javascript語(yǔ)言的執(zhí)行環(huán)境是“單線程”的,如果沒有異步編程,根本...
    呼呼哥閱讀 7,399評(píng)論 5 22
  • 簡(jiǎn)介 基本概念 Generator函數(shù)是ES6提供的一種異步編程解決方案,語(yǔ)法行為與傳統(tǒng)函數(shù)完全不同。本章詳細(xì)介紹...
    呼呼哥閱讀 1,134評(píng)論 0 4
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,445評(píng)論 9 19
  • 在此處先列下本篇文章的主要內(nèi)容 簡(jiǎn)介 next方法的參數(shù) for...of循環(huán) Generator.prototy...
    醉生夢(mèng)死閱讀 1,486評(píng)論 3 8
  • 特別說明,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 737評(píng)論 0 1

友情鏈接更多精彩內(nèi)容