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