ECMAScript 6 未来前景
2019獨角獸企業重金招聘Python工程師標準>>>
未來前景
這篇文章涵蓋了十多個我們從未詳細討論過的新函數。我們可以把這當作在語言的豪宅中進行了一次有趣的游覽,游覽中我們參觀了所有的壁櫥和樓上奇形怪狀的房間。也許有一兩個超級大的地下洞穴。如果你還沒有看過該系列的其他部分,請看這里;本部分未必是最好的開始的地方!
"在你的左邊,你可以看到類型數組……"
一個提前警告:許多下述功能還沒有得到廣泛的實施。好,讓我們開始吧。
你已經使用的函數
ES6 標準化了一些先前使用其他標準或被廣泛使用但并無標準的函數。
類型數組,緩沖數組和數據視圖。這些都曾被標準化為 WebGL 的一部分,從那以后他們已經被應用于許多應用程序編程接口,包括畫布、網絡音頻應用程序編程接口和網頁實時通信。當你需要處理大量的原始二進制或數字數據時,使用它們會非常方便。
例如,如果畫布渲染上下文對象而失去了你想要的特征并且你覺得自己充分掌握了它的核心,你便可以自己將它實現。
var?context?=?canvas.getContext("2d");var?image?=?context.getImageData(0,?0,?canvas.width,?canvas.height);var?pixels?=?image.data;??//?a?Uint8ClampedArray?object//?...?Your?code?here!//?...?Hack?on?the?raw?bits?in?`pixels`//?...?and?then?write?them?back?to?the?canvas:context.putImageData(image,?0,?0);在標準化過程中,類型化數組重新取用了.slice(),.map()和.filter()方法。
Promises。只寫一個有關 promises 的段落就像一口只吃一片薯片。無論這有多難,它都是一件幾乎無意義去做的事情。怎么說呢?Promises 就像異步 JS 編程的基石,他們代表了將被使用的值。舉個例子,當你調用fetch()函數而不是阻塞模式時,它會立即返回一個Promise?對象。Fetch 將進入后臺工作,當反射代碼出現時它會叫你回來。Promises 因鏈接工作的很好而比單獨使用 callbacks 更勝一籌,他們是擁有著趣味操作的一類值,你可以樣板文件更少的情況下擁有錯誤處理權。他們增強了瀏覽器的性能。如果你還不知道關于 promises 的所有,先去看看杰克·阿奇博爾德的深入探究文章。
塊級作用域函數。你本不應該使用它,但在無意中你也許已經使用過了。 在 ES1-5 中,這段代碼在技術上是非法的:
該函數在 if 塊中聲明被認為是非法的。
if?(temperature?>?100)?{??function?chill()?{????return?fan.switchOn().then(obtainLemonade);}chill(); }他們只在頂層或函數的最外層塊內合法。
但是可以說,它被用于所有主要瀏覽器。
不兼容。每個瀏覽器都有一點點不同,但它依然可以工作并且許多網頁仍然在使用它。
謝天謝地,ES6 標準化了這一點。函數被提升到了封閉塊的頂部。
不幸的是,Firefox 和 Safari 沒有執行這項標準。所以就目前而言,使用函數表達式來代替。
if?(temperature?>?100)?{??var?chill?=?function?()?{????return?fan.switchOn().then(obtainLemonade);};chill(); }塊作用域函數沒有在多年前就被標準化的唯一原因是向后兼容的限制極其復雜。沒有人認為它能被解決。ES6 通過添加了一項非常奇怪的規則完成了這項艱巨的任務,這個規則就是僅適用于非嚴格代碼。我無法解釋它。相信我,使用嚴格的模式。
函數名。所有主要 JS 引擎還長期支持有名函數的一個非標準.name屬性。ES6 把這標準化,通過為一些在此之前被認為無名的函數推斷合理的.name,來將其變得更好。
對于其他函數,如回調體現為.then的參數,該規范仍然沒有制定一個名字。fn.name?便成了空字符串。
好的事情
對象 .assign(目標,…源碼)。一個類似于 underscore 的?_.extend()?的新型標準庫函數。
函數調用展開運算符。
早在五月,我們就推出了其余的參數。他們是函數的一個接收任意數量參數的方式,是隨機、復雜難懂的參數對象的更文明的選擇。
function?log(...stuff)?{??//?stuff?is?the?rest?parameter.var?rendered?=?stuff.map(renderStuff);?//?It's?a?real?array.$("#log").add($(rendered)); }我們沒有說的是,有傳遞給函數任意數量參數的匹配語法,能夠更文明的替代?fn.apply()。
//?log?all?the?values?from?an?arraylog(...myArray);當然,它與任何可迭代對象一起工作,這樣你就可以將所有東西記錄在一個集里并記錄為?log(... mySet)。
與其他參數不同的是,在單一的參數列表內多次重復使用展開運算符是有效的。
//?kicks?are?before?tridslog("Kicks:",?...kicks,?"Trids:",?...trids);展開運算符可以方便地扁平化數組中的一個數列。
>?var?smallArrays?=?[[],?["one"],?["two",?"twos"]]; >?var?oneBigArray?=?[].concat(...smallArrays); >?oneBigArray["one",?"two",?"twos"]...但也許這是一個只有我渴求的迫切需要。如果是這樣,我責怪哈斯克爾。
構造數組的展開運算符。同樣追溯回五月,我們談到了解構的“休息”模式。它們是從一個數列中獲取任意數量元素的一種方法。
猜猜發生了什么!竟然有把任意數量元素添加到一個數列中的匹配語法。
>?var?reunited?=?[head,?...tail];>?reunited????[1,?2,?3,?4]所有函數調用的展開運算符的使用規則都相同:你可以在同一數列中多次使用展開運算符等等。
合適的尾調用。這對于我來說太不可思議了,我試著在這里解釋。
要想理解這個特征,最好從《計算程序的結構與解讀》第一頁開始了解。如果你喜歡它,就繼續閱讀下去。尾調用在1.2.1章節“線性遞歸與迭代”中得到了闡述。ES6 標準要求實現“尾遞歸”,這個名詞在其中就有定義。
到現在為止還沒有主要 JS 引擎對其進行實施,因為這比較難以實現。但是一切都很好。
正文
Unicode 版本升級。ES5 至少需要實現支持 Unicode 版本 3.0 的所有字符,ES6 至少需要實現支持 Unicode 版本 5.1.0 的所有字符?,F在你可以使用Linear B中的字符來作為你的函數名了!
Linear A還是有一點冒險。一是因為直到 Unicode 版本 7.0 它才加入,二是因為很難保持用從未被破解的語言編寫代碼。
(即使在 JavaScript 引擎中支持在 Unicode 6.1 中加入表情符號,你也不能使用 ? 作為變量名。出于某種原因,Unicode 協會決定不將其作為標識符的分類。?)
長 Unicode 轉義序列。如早期版本,ES6 支持四位 Unicode 轉義序列。他們是類似于這樣的:\u212A。這樣很好。你可以在字符串中使用它們。如果你感覺很有趣而且你的項目沒有代碼審查政策,你就可以使用它們作為變量名。不過對于像 U+13021 (?) 這樣的字符,它是一個男孩在倒立的埃及象形文字,有一個小問題。數字 13021 有五位數字,超過了四位。
在 ES5 中,你必須編寫兩個 escape,一個 UTF-16代理對。這完全感覺像是生活在黑暗年代:寒冷,苦不堪言,野蠻。ES 就像意大利文藝復興時期的曙光,帶來了巨大的變化:你現在可以編寫帶有\U{13021}的字符串。
為 BMP 以外的字符提供更好的支持。.現在,toUpperCase()和?.toLowerCase()方法用于Desert 字母表的字符串編寫!
本著相同的精神,String.fromCodePoint(...codePoints)字符串與之前的String.fromCharCode(...codeUnits)字符串非常相似,但是它支持BMP以外的代碼點。
Unicode 的正則表達式。ES6 正則表達式支持一個新的標志—— u 標志,它會導致正則表達式把 BMP 外的字符當作單個字符對待,而不是作為兩個單獨的代碼單元。例如,沒有u,/./只會匹配一半的字符“?”。但是/./u會匹配到整個字符。
把u標志放在正則表達式上還實現了更多支持 Unicode 的不區分大小寫的匹配和長 Unicode 轉義序列。對于整個故事,請見馬迪亞斯·賓恩斯的詳細發布。
粘性正則表達式。非 Unicode 相關特征是 y 標志,也稱為粘性標記。粘性正則表達式只查找由它的.lastIndex屬性給出的、由確切開端開始的匹配。如果沒有匹配存在,粘性正則表達式會立即返回 null,而不是掃描前面的字符串在其他地方尋找一個匹配。
官方國際化規格。ES6 實現了提供的任何國際化功能必須支持ECMA-402,它是 ECMAScript 的 2015 年國際化 API 規范。這個單獨的標準指定了Intl對象。Firefox,Chrome 和 IE11+ 已經完全支持它了。Node 0.12 也是。
數
二進制與八進制數字。如果你需要一個奇特的方式來編寫數 8,675,309,并且 0x845fed 完成不了這項任務,你現在可以編寫 0o41057755(八進制)或 0b100001000101111111101101 (二進制)。
Number(str)現在也承認這種格式的字符串:Number(“0b101010”)返回 42。
(快速提示:number.toString(base)?和?parseInt(string, base)?都是從任意基址做數字轉換的原始方式。)
新的數字函數和常量。這些都非常小眾。如果你感興趣,可以從Number.EPSILON開始自己瀏覽標準。
也許這里最有趣的新理念是“安全整數”的作用域,包括從-(253-1)到+(253-1)。這種數字的特殊作用域和 JS 的存在時間一樣久。在此作用域內每個整數都可以被確切表示為一個 JS 數,就是與之最近的那個數??偟膩碚f,這是++和—的正常工作作用域。在此作用域之外,奇數不能被表示為 64 位浮點數,所以遞增和遞減可表示的數(都是偶數)不能得出正確結果。萬一這關系到你的代碼,這項標準現在提供了Number.MIN_SAFE_INTEGER和Number.MAX_SAFE_INTEGER常數,還有謂語Number.isSafeInteger(n)。
新的數學函數。ES6 加入了雙曲三角函數和他們的反函數,Math.cbrt(x)用來計算立方根,?Math.hypot(x, y)用來計算直角三角形的斜邊,?Math.log2(x)?和Math.log10(x)用來計算常見的對數,Math.clz32(x)用來幫助計算整數對數,等等。
Math.sign(x)獲取數的符號。
ES6 還增加了Math.imul(x, y),它標志著乘法模 232。這是一件很奇怪的事情……除非你在 JS 沒有 64 位整數或大整數的事實環境中工作。在這種情況下,這是非常方便的。這幫助了程序編譯。在 JS 中 Emscripten 使用此函數來實現 64 位整數的乘法。
同樣,Math.fround(x)對于需要支持 32 位浮點數的編譯程序來說也是很有幫助的。
結束
這是一切嗎?
并不是。我甚至沒有提及所有內置迭代器的共同原型對象,絕密的?GenerationFunction 構造函數,?Object.is(v1, v2),Symbol.species 是怎樣幫助支持像 Promise 和 Array 的子類內置函數,或 ES6 是如何指定那些從未被標準化過的多項全局工作的細節的。
我確定我還忘記了一些東西。
但是如果你一直關注著,你對于我們將要走向的方向有一幅美麗的藍圖,你便知道從今天起你可以使用 ES6 函數了。如果你這樣做了,你便是選擇了一種更好的語言。
幾天前喬?!つ藢ξ艺f,他剛剛在約50行代碼中用了八種不同的 ES6 函數,然而用的時候并沒有真的去考慮它。他用了模塊、類、參數默認值、集合、映射、模板字符串、箭頭函數以及讓。(他忘記了 for-of 循環。)
這同樣也是我的經歷。這些新函數結合在一起十分好用。最終你會發現,它們會出現在你編寫的幾乎每一行 JS 代碼中。
同時,每個 JS 引擎都在加緊實施和優化那些我們前幾個月一直在討論的函數。
一旦我們完成了,語言將會是完整的。我們再也不用改變任何事情了。我得去找別的工作了。
只是開個玩笑。ES7 的提案已經初見端倪。
求冪運算符。2**8 將返回 256。這將在火狐夜間瀏覽器中實現。
Array.prototype.includes(值)。如果此數組包含給定的值便返回 true。在火狐夜間瀏覽器和 Polyfillable 中得到實現。
SIMD。公開現代 CPU 提供的 128 位SIMD指令。這些指令在 2、4 或 8 相鄰的數組元素中依次執行算術運算。它們可以大大加快各種各樣用于音頻和視頻流、加密技術、游戲、圖像處理等等的算法。簡約而不簡單。在火狐夜間瀏覽器和 polyfillable 中實現。
異步函數。我們在生成器的作用上暗示了這個函數。異步函數就像生成器,但它專門用于異步編程。當你調用一個生成器時,會返回一個迭代器。當你調用一個異步函數時,會返回一個 promise。生成器利用關鍵詞“theyield”來實現暫停并產生一個值;異步函數使用關鍵詞“await”來實現暫停并等待一個 promise。
很難用幾句話來描述他們,但是異步函數會是 ES7 的一個標志性特征。
類型對象。這是一個后續類型數組。類型化數組有類型化的元素。類型化對象只是擁有類型化屬性的對象
你只會出于性能的原因而這樣做。像類型數組、類型對象提供了一些類型化的好處(緊湊內存使用和速度),但在逐對象和選擇性加入的基礎上,相比之下語言都是靜態類型。
它們作為 JS 的編譯目標也很有趣。
實現在火狐夜間版。
類和屬性裝飾。在屬性、類或方法上添加裝飾標簽。一個例子展示了這是什么:
@debug.logWhenCalled?在這里是裝飾。你可以想象它在這個方法中起到了什么作用。
該提案通過舉例說明了它工作的詳細細節。
還有一個令人興奮的發展,我不得不提。這不是一個語言特征。
TC39, the ECMAScript 標準委員會,正在走向更頻繁的發布和更公開的進程。ES5 和 ES6 之間隔了六年。該委員會旨在 ES6 之后短短的 12 個月內發布 ES7。隨后該標準將形成每 12 個月頒布一個版本的節奏。上述的一些特性正在準備中。它們將“趕上這班火車”成為 ES7 的一部分。那些在該時間內沒有完成的將會乘坐下一班火車。
十分開心能分享 ES6 的許許多多的令人驚嘆的好處。同時也可以非常高興地在這里說,如此規模的特征轉儲可能永遠不會再發生了。
感謝大家參加“深度解析 ES6”!希望大家會喜歡。保持聯系。
?
轉載于:https://my.oschina.net/wenquan0hf/blog/533344
總結
以上是生活随笔為你收集整理的ECMAScript 6 未来前景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AJAX 简单讲解
- 下一篇: css案例学习之div与span的区别