這篇文章涵蓋了十多個我們從未詳細(xì)討論過的新函數(shù)。我們可以把這當(dāng)作在語言的豪宅中進行了一次有趣的游覽,游覽中我們參觀了所有的壁櫥和樓上奇形怪狀的房間。也許有一兩個超級大的地下洞穴。如果你還沒有看過該系列的其他部分,請看這里;本部分未必是最好的開始的地方!
http://wiki.jikexueyuan.com/project/es-six-deeply/images/future.png" alt="alt text" />"在你的左邊,你可以看到類型數(shù)組……"
一個提前警告:許多下述功能還沒有得到廣泛的實施。好,讓我們開始吧。
ES6 標(biāo)準(zhǔn)化了一些先前使用其他標(biāo)準(zhǔn)或被廣泛使用但并無標(biāo)準(zhǔn)的函數(shù)。
例如,如果畫布渲染上下文對象而失去了你想要的特征并且你覺得自己充分掌握了它的核心,你便可以自己將它實現(xiàn)。
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);
在標(biāo)準(zhǔn)化過程中,類型化數(shù)組重新取用了.slice(),.map()和.filter()方法。
Promises。只寫一個有關(guān) promises 的段落就像一口只吃一片薯片。無論這有多難,它都是一件幾乎無意義去做的事情。怎么說呢?Promises 就像異步 JS 編程的基石,他們代表了將被使用的值。舉個例子,當(dāng)你調(diào)用fetch()函數(shù)而不是阻塞模式時,它會立即返回一個Promise 對象。Fetch 將進入后臺工作,當(dāng)反射代碼出現(xiàn)時它會叫你回來。Promises 因鏈接工作的很好而比單獨使用 callbacks 更勝一籌,他們是擁有著趣味操作的一類值,你可以樣板文件更少的情況下?lián)碛绣e誤處理權(quán)。他們增強了瀏覽器的性能。如果你還不知道關(guān)于 promises 的所有,先去看看杰克·阿奇博爾德的深入探究文章。
該函數(shù)在 if 塊中聲明被認(rèn)為是非法的。
if (temperature > 100) {
function chill() {
return fan.switchOn().then(obtainLemonade);
}
chill();
}
他們只在頂層或函數(shù)的最外層塊內(nèi)合法。
但是可以說,它被用于所有主要瀏覽器。
不兼容。每個瀏覽器都有一點點不同,但它依然可以工作并且許多網(wǎng)頁仍然在使用它。
謝天謝地,ES6 標(biāo)準(zhǔn)化了這一點。函數(shù)被提升到了封閉塊的頂部。
不幸的是,F(xiàn)irefox 和 Safari 沒有執(zhí)行這項標(biāo)準(zhǔn)。所以就目前而言,使用函數(shù)表達式來代替。
if (temperature > 100) {
var chill = function () {
return fan.switchOn().then(obtainLemonade);
};
chill();
}
塊作用域函數(shù)沒有在多年前就被標(biāo)準(zhǔn)化的唯一原因是向后兼容的限制極其復(fù)雜。沒有人認(rèn)為它能被解決。ES6 通過添加了一項非常奇怪的規(guī)則完成了這項艱巨的任務(wù),這個規(guī)則就是僅適用于非嚴(yán)格代碼。我無法解釋它。相信我,使用嚴(yán)格的模式。
.name屬性。ES6 把這標(biāo)準(zhǔn)化,通過為一些在此之前被認(rèn)為無名的函數(shù)推斷合理的.name,來將其變得更好。> var lessThan = function (a, b) { return a < b; };
> lessThan.name
"lessThan"
對于其他函數(shù),如回調(diào)體現(xiàn)為.then的參數(shù),該規(guī)范仍然沒有制定一個名字。fn.name 便成了空字符串。
對象 .assign(目標(biāo),…源碼)。一個類似于 underscore 的 _.extend() 的新型標(biāo)準(zhǔn)庫函數(shù)。
早在五月,我們就推出了其余的參數(shù)。他們是函數(shù)的一個接收任意數(shù)量參數(shù)的方式,是隨機、復(fù)雜難懂的參數(shù)對象的更文明的選擇。
function log(...stuff) { // stuff is the rest parameter.
var rendered = stuff.map(renderStuff); // It's a real array.
$("#log").add($(rendered));
}
我們沒有說的是,有傳遞給函數(shù)任意數(shù)量參數(shù)的匹配語法,能夠更文明的替代 fn.apply()。
// log all the values from an array
log(...myArray);
當(dāng)然,它與任何可迭代對象一起工作,這樣你就可以將所有東西記錄在一個集里并記錄為 log(... mySet)。
與其他參數(shù)不同的是,在單一的參數(shù)列表內(nèi)多次重復(fù)使用展開運算符是有效的。
// kicks are before trids
log("Kicks:", ...kicks, "Trids:", ...trids);
展開運算符可以方便地扁平化數(shù)組中的一個數(shù)列。
> var smallArrays = [[], ["one"], ["two", "twos"]];
> var oneBigArray = [].concat(...smallArrays);
> oneBigArray
["one", "two", "twos"]
...但也許這是一個只有我渴求的迫切需要。如果是這樣,我責(zé)怪哈斯克爾。
> var [head, ...tail] = [1, 2, 3, 4];
> head
1
> tail
[2, 3, 4]
猜猜發(fā)生了什么!竟然有把任意數(shù)量元素添加到一個數(shù)列中的匹配語法。
> var reunited = [head, ...tail];
> reunited
[1, 2, 3, 4]
所有函數(shù)調(diào)用的展開運算符的使用規(guī)則都相同:你可以在同一數(shù)列中多次使用展開運算符等等。
要想理解這個特征,最好從《計算程序的結(jié)構(gòu)與解讀》第一頁開始了解。如果你喜歡它,就繼續(xù)閱讀下去。尾調(diào)用在1.2.1章節(jié)“線性遞歸與迭代”中得到了闡述。ES6 標(biāo)準(zhǔn)要求實現(xiàn)“尾遞歸”,這個名詞在其中就有定義。
到現(xiàn)在為止還沒有主要 JS 引擎對其進行實施,因為這比較難以實現(xiàn)。但是一切都很好。
Unicode 版本升級。ES5 至少需要實現(xiàn)支持 Unicode 版本 3.0 的所有字符,ES6 至少需要實現(xiàn)支持 Unicode 版本 5.1.0 的所有字符?,F(xiàn)在你可以使用Linear B中的字符來作為你的函數(shù)名了!
Linear A還是有一點冒險。一是因為直到 Unicode 版本 7.0 它才加入,二是因為很難保持用從未被破解的語言編寫代碼。
(即使在 JavaScript 引擎中支持在 Unicode 6.1 中加入表情符號,你也不能使用