<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                > 原文出處:http://www.infoq.com/cn/articles/es6-in-depth-the-future 在上一篇文章《[深入淺出ES6(十六):模塊 Modules](http://www.infoq.com/cn/articles/es6-in-depth-modules)》中,我們徹底講解完了ES6中的新特性,整個系列歷經4月之久。 出于對文章長度的考慮,我們還保留了一些尚未提及的新特性,在最后的這篇文章中我會集中介紹一下這些新特性。你就當這是一次奇妙的旅程吧,無意間走進一幢語言大廈,路過形形色色的衣櫥,穿梭于樓上奇形怪狀的房間之間,偶爾還會看到一兩個地下洞穴。如果你從未閱讀過[此系列](http://www.infoq.com/cn/es6-in-depth/)中的其它文章,請務必提前瀏覽一遍,本文會提及許多過去文章中的內容,首次閱讀的讀者會略感吃力。 ![](https://box.kancloud.cn/2015-11-25_5655856628061.jpg) “在你的左手邊,你可以看到一個定型數組…” 在這里我還要再多說一句:下面提及的許多特性目前尚未被廣泛實現。 好的,那就讓我們開始吧。 ## 你可能正在使用的特性 ES6除了新增特性外還有兩類特殊的特性:其中一些特性早已被各大廠商廣泛實現并使用,但是它們并沒有被標準化;還有一些特性采自過去其它的標準。 * [定型數組(Typed arrays)](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)、[數組緩沖(ArrayBuffer)](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)和[數據視圖(DataView)](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/DataView)。這些特性全都來自WebGL標準,自這些特性出現后也被陸續用于實現許多其它的API,例如Canvas、Web Audio還有WebRTC。這些特性可以協助你處理大量原始的二進制數據或數值型數據。 舉個例子,如果`Canvas`的渲染上下文中缺少了你想要的特性,而你又認為這個特性足夠重要,你可以借助以上特性自己實現一個: ~~~ var context = canvas.getContext("2d"); var image = context.getImageData(0, 0, canvas.width, canvas.height); var pixels = image.data; // 一個Uint8ClampedArray對象 // ... 你的代碼 // ... 直接修改原始的`像素`數據 // ... 然后將修改后的數據寫回canvas: context.putImageData(image, 0, 0); ~~~ * 在標準化的進程中,定型數組采用了例如.slice()、.map()還有.filter()這樣的[方法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray#Methods)。 * Promise。不要覺得promise很難,簡而言之,它只不過是一段異步JS編程的構建代碼塊,它可以為你提供一些非立即可用的值。舉個例子,當你調用[`fetch()`](https://developer.mozilla.org/zh-CN/docs/Web/API/GlobalFetch/fetch)方法獲取數據時,它不會阻塞,而是會立即返回一個[promise](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise)對象。此時fetch函數一直在后臺運行,直到響應到達時才會回調。結合promise的許多特性要優于單獨使用回調實現各種功能,你可完美地將它們鏈接起來;它們是一等的值,相關操作非常有趣,例如[`promise.all()`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)可以等到所有promise都完成之后才運行,[`promise.race()`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/race)會在多個promise間制造一種競爭關系,當其中一個完成時,其它promise則被拒絕;用于錯誤處理的樣板代碼要簡單得多。目前有一些瀏覽器暫不支持promise功能,可以加入polyfill為用戶提供相關功能,如果你還不了解什么是promise,那就來看看[Jake Archibald深入剖析promise的文章](http://www.html5rocks.com/zh/tutorials/es6/promises/)吧。 * 塊級作用域內部函數。這是一個不推薦使用的特性,但是你可能無意中已經使用過了。 在ES 1-5中,下面這段代碼從技術角度來看是非法的: ~~~ if (temperature > 100) { function chill() { return fan.switchOn().then(obtainLemonade); } chill(); } ~~~ 此處的函數聲明位于`if`代碼塊內部,標準中不支持這樣的聲明操作。函數聲明只有在最外層作用域或次外層函數作用域中才是合法的。 但是這種方式卻被幾乎所有的主流瀏覽器所接受。 雖然每一家廠商的實現相互之間不能完美兼容,但是基本都可以運行,而且目前有許多web頁面仍在使用這種函數聲明方式。 謝天謝地,在ES6中將這種聲明方式也納入標準化范圍啦,函數聲明會被提升到封閉代碼塊的頂部。 到目前為止,Firefox和Safari中尚未實現這一新標準,如果需要請使用函數表達式來進行聲明: ~~~ if (temperature > 100) { var chill = function () { return fan.switchOn().then(obtainLemonade); }; chill(); } ~~~ 許多年前,委員會認為向后兼容的限制非常復雜,所以沒有將塊級作用域函數進行標準化。當時沒有人可以解決這些問題,而在ES6中,委員會在非嚴格模式下添加了一個[非常奇怪的規則](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-block-level-function-declarations-web-legacy-compatibility-semantics)從而克服了這個困難,我不便在這里作過多解釋,請相信我,一定要使用嚴格模式,切記,切記! * 函數名稱。長久以來,所有主流的JS引擎都會為命名函數添加一個`.name`屬性,而這一做法并沒有得到標準的支持。ES6標準對這一行為進行了支持,由于在這之前通過函數表達式聲明的函數被認為是未命名函數,新標準通過命名感知的方式為其也添加了`.name`屬性。 ~~~ > var lessThan = function (a, b) { return a < b; }; > lessThan.name "lessThan" ~~~ 對于其它函數,例如為`.then`方法添加一個回調函數作為參數,新標準仍然不能斷定這個函數的名稱,因此`fn.name`就會被置為一個空字符串。 ## 實用特性 * [Object.assign(target, ...sources)](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)。一個新的標準庫函數,與Underscore中的[`_.extend()`](http://underscorejs.org/#extend)類似。 * 應用于函數調用的展開(Spread)運算符。這玩意兒跟Nutella沒半毛錢關系,即使Nutella打開之后口感非常棒(譯者注:Nutella是一個巧克力醬品牌,其廣告語中使用的spread一詞深入人心)。但它的確是一個美味的特性,我想你會喜歡它的。 在文章《[深入淺出ES6(五):不定參數和默認參數](http://www.infoq.com/cn/articles/es6-in-depth-rest-parameters-and-defaults)》中,我們介紹了不定參數(Rest),通過這種方式聲明的函數可以接受任意數量的參數,相對于之前傳遞隨機而又略顯笨拙的`arguments`對象而言,這顯然是一種更為優雅的選擇。 ~~~ function log(...stuff) { // stuff是不定參數。 var rendered = stuff.map(renderStuff); // 它實際上是一個數組 $("#log").add($(rendered)); } ~~~ 其實還有另外一種匹配語法,可以用這種語法給函數傳遞任意數量的參數,可以讓`fn.apply()`函數看起來更優雅: ~~~ // 記錄數組中的所有值 log(...myArray); ~~~ 展開運算符適用于所有[可迭代對象](http://www.infoq.com/cn/articles/es6-in-depth-iterators-and-the-for-of-loop),所以你可以用`log(...mySet)`將所有的內容記錄在一個`Set`中。 與不定參數不同的是,你可以在同一個參數列表中多次使用展開操作符: ~~~ // kicks在trids之前 log("Kicks:", ...kicks, "Trids:", ...trids); ~~~ 展開運算符也可以讓多維數組展開變得不再復雜: ~~~ > var smallArrays = [[], ["one"], ["two", "twos"]]; > var oneBigArray = [].concat(...smallArrays); > oneBigArray ["one", "two", "twos"] ~~~ ...但也可能只有我有這個迫切的需求。如果真的是這樣,那還是去責備Haskell好啦。 * 應用于構建數組的展開運算符。在另外一篇文章《[深入淺出ES6(六):解構 Destructuring](http://www.infoq.com/cn/articles/es6-in-depth-destructuring)》中,我們還討論了如何將解構改造為“不定(rest)”模式。你可以通過這種方法從數組中取出任意數量的元素。 ~~~ > var [head, ...tail] = [1, 2, 3, 4]; > head 1 > tail [2, 3, 4] ~~~ 你猜怎么著!這兒還有一種匹配語法可以將任意數量的元素整合到數組中: ~~~ > var reunited = [head, ...tail]; > reunited [1, 2, 3, 4] ~~~ 此處所有的規則與應用于函數調用的展開運算符完全相同,也就是說,在相同的數組中你也可以使用多次展開運算符,等等。 * 完全尾調用。于我而言,很難用如此短的篇幅介紹這個優化后的新特性。 《[Structure and Interpretation of Computer Programs](https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-9.html#%_chap_1)》一書可以幫助你更好地理解這個特性,如果你喜歡這本書,就繼續閱讀下去吧,或者直接跳到[章節1.2.1——線性遞歸和迭代](https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.1),正如文中所述,在ES6標準中所有的實現也都必須是“尾遞歸(Tail-Recursive)”。 目前尚無主流的JS引擎實現這一功能。雖然新功能實現起來很困難,但是都會盡快實現。 ## 文本 * 升級Unicode版本。?ES5中要求至少支持Unicode 3.0中的所有的字符;而ES6要求至少支持Unicode 5.1.0中的所有字符。現在你可以用[古希臘B型線性文字](https://zh.wikipedia.org/wiki/%E7%BA%BF%E5%BD%A2%E6%96%87%E5%AD%97B)命名你的函數了! 由于直到Unicode 7.0才會支持[A型線性文字](https://zh.wikipedia.org/wiki/%E7%BA%BF%E5%BD%A2%E6%96%87%E5%AD%97A),而且維護用一門尚未被譯解的語言編寫的代碼可能很困難,所以目前不建議冒險使用。 (有的JavaScript引擎支持了添加于Unicode 6.1的emoji表情,即使在這些引擎中也不能將Unicode特殊字符作為一個變量名稱。出于某些原因,Unicode財團決定不把它歸類為標識符字符。) * 長Unicode轉義序列。?ES6新標準與之前的版本相似,也支持類似`\u212A`的 四位數Unicode轉義序列,這個特性非常好,你可以在字符串中使用這種序列,如果純粹出于好奇,或者你的項目沒有任何代碼審查的策略,也可以用它來類 命名變量哦。但是,對于像U+13021這樣的字符就不能正常解析,數字13021有五位數字,比四位還多一位,你就無法看到埃及象形文字中一個倒立的人了。 ![](https://box.kancloud.cn/2015-11-25_565585663bb79.png) 在ES5中,你需要用兩個轉義(亦即一個[UTF-16代理對][26])來表示,這種感覺完全像是生活在黑暗時代:冰冷、悲慘、野蠻。而ES6,則像意大利文藝復興時期的黎明一樣,為我們帶來了極大的改變:你現在可以直接寫`\u{13021}`啦。 * 更好地支持基本多文種平面(BMP)以外的字符。所以現在用[德賽萊特字母表](https://en.wikipedia.org/wiki/Deseret_alphabet)里的字符組成的字符串也可以調用`.toUpperCase()`和`.toLowerCase()`方法了! [`String.fromCodePoint(...codePoints)`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)與[`String.fromCharCode(...codeUnits)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)本質上相同,只不過額外增加了BMP外的碼位支持。 * Unicode正則表達式。?ES6中的正則表達式支持一個新的修飾符:`u`。在加入修飾符u的正則表達式中,BMP以外的字符都被視為單個字符,而不是兩個相互分離的碼元。舉個例子,如果不加`u`,`/./`只能匹配字符`“&#x1f62d;”`的前半部分,但是`/./u`就可以匹配整個字符。 想要支持更多能夠處理Unicode的大小寫不敏感匹配還有長Unicode轉義序列,記得要給正則表達式添加修飾符`u`。欲了解詳情,請閱讀[Mathias Bynens撰寫的更詳細的文章](https://mathiasbynens.be/notes/es6-unicode-regex)。 * 粘性正則表達式。該特性為正則表達式添加了一個[粘性修飾符](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/sticky)`y`,與Unicode無關。它只會查找始于特定偏移量的匹配,偏移量給自它的`.lastIndex`屬性;如果沒有相應匹配,它會立即返回`null`,不會在字符串中繼續向前掃描來查找下一處匹配。 * 官方版國際化標準。標準規定,任何提供國際化相關特性的ES6實現必須支持[ECMAScript 2015國際化API規范——ECMA-402](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl)。這個單立標準對[`Intl`對象](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl)進行了詳細說明。Firefox、Chrome、IE 11+和Node 0.12已經全部支持了這一特性。 ## 數字 * 二進制和八進制數字字面量。想要用不一樣的方式來表示數字8675309么?`0x845fed`不是正確的答案。新標準中使用`0o`表示八進制,使用`0b`表示二進制,所以你可以寫成`0o41057755`(八進制)或者`0b100001000101111111101101`(二進制)。 `Number(str)`識別字符串的規則與之相同:`Number("0b101010")`會返回42。 (快速提示:`number.toString(base)`和`parseInt(string, base)`按照原始方式來對數字進行任意基底轉換。) * 新的`Number`函數和常量。這些新特性是專門為`Number`打造的,如果你感興趣可以親自瀏覽標準,從[Number.EPSILON](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-number.epsilon)開始瀏覽。 這其中最有趣的新思想當屬“安全整數”范圍,從-(2^53-1)到+(2^53-1)都在這個范圍之中。從JS誕生開始這組特殊的數字范圍就已經存在,這個范圍中的每一個整數都可以表示一個JS數字,這也是`++`和`--`操作符合法的運行范圍。超出這個范圍之外的奇數整型數字不能被表示為64位浮點數,所以對能被表示的數字(都是偶數)進行遞增或遞減操作得不到正確的結果。為了讓你的代碼不受影響,代碼中新增加了兩個常量[`Number.MIN_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MIN_SAFE_INTEGER)和[`Number.MAX_SAFE_INTEGER`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER),還增加了一個斷言函數[`Number.isSafeInteger(n)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger)。 * 新的`Math`函數。?ES6標準中新增了一些雙曲三角函數和它們的逆函數,例如[`Math.sinh()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sinh)、[`Math.cosh()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/cosh)、[`Math.tanh()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/tanh)、[`Math.asinh()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/asinh)、[`Math.acosh()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/acosh)、[`Math.atanh()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/atanh),用于計算立方根的[`Math.cbrt(x)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/cbrt)函數、用于計算直角三角形斜邊的[`Math.hypot(x, y)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot)函數,用于計算同底對數的[`Math.log2(x)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/log2)和[`Math.log10(x)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/log10)函數,幫助計算整數對數的[`Math.clz32(x)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32)函數以及其它的一些函數。 [`Math.sign(x)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/sign)可以用來獲取數字的符號。 ES6也添加了[`Math.imul(x, y)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/imul)函數,用以計算x的y次冪。JS中沒有64位整數或大整數是一件很奇怪的事情,所以在某些情況下這個函數非常有用,比如編譯器可以用這個函數來優化代碼操作,Emscripten就用它來實現JS中的64位整數乘法。 與之類似的是,[`Math.fround(x)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/fround)用于支持32位浮點數操作。 ## 最后的最后 以上就你想要講的所有內容咯? 好吧,其實還有許多沒有講。我甚至沒有提到所有內建迭代器通用的原型對象[IteratorPrototype](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%iteratorprototype%-object),絕密的[GeneratorFunction](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-generatorfunction-constructor)構造函數,[Object.is(v1, v2)](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/is),用于支持像[Array](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-arrayspeciescreate)和[Promise](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype.then)這些的子類化內建方法的`Symbol.species`函數,甚或是在ES6標準中指定[多全局變量](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-code-realms)的具體細節,這一部分之前從未得到正式的標準化。 我確信我也會遺漏許多有用的內容。 但是如果你一路跟著我們走下來,你自然會知道未來將發展向何處。你已經知道[現在就可以開始使用ES6特性](http://www.infoq.com/cn/articles/es6-in-depth-babel-and-broccoli),而且一旦你這樣做,無疑是選擇了一門比之前更好的語言。 前些日子,[Josh Mock](https://twitter.com/JoshMock)對我說他現在會下意識地優先使用ES6的特性,在大約50行代碼中已經用了[八種不同的新特性](https://gist.github.com/JoshMock/98f187c7a8bf745e4cf6),包括:模塊(`Module`)、類(`Class`)、默認參數(`Argument Default`)、`Set`、`Map`、模板字符串、箭頭函數,還有`let`,是的,他忘記說`for-of`循環了。 這也是我目前所體會到的,互相結合的新特性非常實用,它們最終會滲透到你寫的每一行JS代碼中。 與此同時,每一個JS引擎都在加急實現并優化到目前為止我們討論的所有特性。 我們的系列馬上就完結了,此時各大引擎也將多多少少實現了大部分語言特性,這就是最后一篇文章啦,我得去找點兒其它的事情來做。 開玩笑啦。[ES7標準的提案](https://github.com/tc39/ecma262)已經在加速篩選中,我們就選取幾個來看一下吧: * [乘方操作符](https://github.com/rwaldron/exponentiation-operator)。?`2 ** 8`將返回256.在[Firefox Nightly](https://nightly.mozilla.org/)中已經實現。 * [`Array.prototype.includes(value)`](https://github.com/tc39/Array.prototype.includes/)。如果數組中包含給定值將返回true,這個特性在Firefox Nightly中也已實現,可以編寫相應的polyfill在不支持該特性的瀏覽器中使用。 * [單指令多數據(SIMD)](https://docs.google.com/presentation/d/1MY9NHrHmL7ma7C8dyNXvmYNNGgVmmxXk8ZIiQtPlfH4/edit?usp=sharing)。暴露現代CPU提供的128位[SIMD指令](https://zh.wikipedia.org/wiki/%E5%8D%95%E6%8C%87%E4%BB%A4%E6%B5%81%E5%A4%9A%E6%95%B0%E6%8D%AE%E6%B5%81), 這些指令可以對2、4或8組相鄰的數組元素同時進行算數運算。它們能夠加速各種各樣的算法加速,為流媒體、密碼學、游戲、圖像處理以及很多其它領域提供客 觀的性能提升。這些指令非常低階但是非常實用,在Firefox Nightly中也已實現,同樣可以編寫相應的polyfill在不支持該特性的瀏覽器中使用。 * [Async異步函數](https://github.com/tc39/ecmascript-asyncawait)。我們在《[深入淺出ES6(三):生成器 Generators](http://www.infoq.com/cn/articles/es6-in-depth-generators)》一文中捎帶著提到過這個特性。Async函數與生成器類似,但是專門用于異步編程操作。當你調用生成器時,它會返回一個迭代器。當你調用async函數時,它會返回一個promise。生成器使用`yield`關鍵詞來暫停并產生值;async函數使用`await`關鍵詞來暫停并等待promise。 我很難用簡短的幾句話把這些特性描述清楚,但是async函數將成為ES7標準中具有里程碑意義的一個特性。 * [定型對象](https://github.com/dslomov/typed-objects-es7)。定型數組中包含著定型元素,定型對象與定型數組的概念類似,簡單來說定型對象中的屬性都擁有確定的類型。 ~~~ // 創建一個新的結構類型,每一個Point都有兩個字段 // 分別命名為x和y。 var Point = new TypedObject.StructType({ x: TypedObject.int32, y: TypedObject.int32 }); // 現在創建一個這個類型的實例。 var p = new Point({x: 800, y: 600}); console.log(p.x); // 800 ~~~ 你可能只會出于性能的原因才指定具體的類型。定型對象與定型數組通過為變量、數組和對象指定具體的類型,壓縮內存的使用量并提高應用的性能,但是在逐對象、選擇性加入的基礎上,卻與處處都是靜態類型的語言相反。 將JS作為一個編譯目標也很有趣。 定型對象在Firefox Nightly已得到實現。 * [類和屬性修飾符](https://github.com/wycats/javascript-decorators/blob/master/README.md)。修飾符是你為屬性、類或方法添加的標簽。你可以通過這個示例初步了解一下: ~~~ import debug from "jsdebug"; class Person { @debug.logWhenCalled hasRoundHead(assert) { return this.head instanceof Spheroid; } ... } ~~~ 這里的`@debug.logWhenCalled`就是修飾符,你可以想象一下它都對方法做了些什么。 [提案](https://github.com/wycats/javascript-decorators/blob/master/README.md)中對此做出了詳細的解釋,同時也舉了許多示例。 我還想討論一下更令人激動的標準發展進程,對,我們不介紹語言特性了。 ECMAScript標準委員會TC39日后會提高新版本的發布速度,也會[提高公開標準進程的透明度](https://tc39.github.io/process-document/)。ES5與ES6間隔六年之久,委員會下定決心要在12個月的時間內從ES6進化到ES7,標準的后續版本將按照每12個月一次的節奏發布。以上列舉的其中一些特性將在那時整裝待發,爭取趕上ES7這趟火車,屆時時間表中尚未完成的特性可以趕下一趟火車。 哈哈,分享ES6中數量驚人的新特性非常有趣,這種大規模的特性發布可能再也見不到了,我為此感到無比榮幸。 感謝您一路走來陪伴我們一起《[深入淺出ES6](http://www.infoq.com/cn/es6-in-depth/)》,希望你能喜歡。有任何問題歡迎隨時聯系我。 > 譯者的話:說真的,[深入淺出ES6專欄](http://www.infoq.com/cn/es6-in-depth/)終于要告一段落了。我此刻的心情與作者同樣復雜,心里突然就空了一片。回顧過去的150余天,堅持專欄翻譯的日子艱苦也快樂,編輯[徐川](http://www.infoq.com/cn/author/%E5%BE%90%E5%B7%9D)細心地幫我審校每一篇文章,編輯[丁曉昀](http://www.infoq.com/cn/author/%E4%B8%81%E6%99%93%E6%98%80)贈予錢歌川先生[詳解翻譯之著作](http://book.douban.com/subject/26425721/)讓我大開眼界,與李松峰老師的交流也讓我深刻理解了“[閱讀、轉換、表達](http://www.ituring.com.cn/article/114901)” 的奧義所在。選擇ES6作為前端生涯的切入點實之我幸,恰遇這樣的機會讓我可以一心一意地向前走,向未來走。我很敬佩在“洪荒”和“戰亂”年代沉淀無數經 驗的前輩們,你們在各種不確定的因素中左右互搏,為終端用戶提供統一的用戶體驗,直到如今你們依然孜孜不倦地吸取業內新鮮的經驗。技術在進步,也為前端人 提供著無限的可能性,我們有責任也有義務去推動新標準的發展和普及,誠然在商業的大環境下我們不愿放棄每一寸用戶的土壤,但攜眾人之力定將能推動用戶終端 的革新。[ES7標準的提案](https://github.com/tc39/ecma262)紛紛提上日程,用不了多久也將登上前端大舞臺。也感謝[午川](http://www.infoq.com/cn/author/%E5%8D%88%E5%B7%9D)同學友情提供譯文《[深入淺出ES6(十):集合 Collection](http://www.infoq.com/cn/articles/es6-in-depth-collections)》,讓我在困難時期得以順利過渡。最后祝愿國內前端社區向著更光明美好的未來蓬勃生長!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看