日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ES6新特性(转)

發布時間:2024/4/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ES6新特性(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文基于lukehoban/es6features?,同時參考了大量博客資料,具體見文末引用。

ES6(ECMAScript?6)是即將到來的新版本JavaScript語言的標準,代號harmony(和諧之意,顯然沒有跟上我國的步伐,我們已經進入中國夢版本了)。上一次標準的制訂還是2009年出臺的ES5。目前ES6的標準化工作正在進行中,預計會在14年12月份放出正式敲定的版本。但大部分標準已經就緒,且各瀏覽器對ES6的支持也正在實現中。要查看ES6的支持情況請點此。

目前想要運行ES6代碼的話,可以用google/traceur-compiler將代碼轉譯。點此訪問traceur-compiler 在線版本時實編輯ES6代碼并查看轉換后的結果,代碼運行結果會在console顯示。

另外,關于Google Traceur,業界大神Addy Osmani利用前者寫了個Chrome插件ES6 Tepl,安裝后也可以進行ES6的測試。

當然,并不是所有ES6新特性都被實現了,所以上面的方法可以測試大部分,有一些還是無法測試的。

雖然ES6都還沒真正發布,但已經有用ES6重寫的程序了,各種關于ES789的提議已經開始了,這你敢信。潮流不是我等大眾所能追趕的。

潮流雖然太快,但我們不停下學習的步伐,就不會被潮流丟下的,下面來領略下ES6中新特性,一堵新生代JS的風采。

箭頭操作符

如果你會C#或者Java,你肯定知道lambda表達式,ES6中新增的箭頭操作符=>便有異曲同工之妙。它簡化了函數的書寫。操作符左邊為輸入的參數,而右邊則是進行的操作以及返回的值Inputs=>outputs。

我們知道在JS中回調是經常的事,而一般回調又以匿名函數的形式出現,每次都需要寫一個function,甚是繁瑣。當引入箭頭操作符后可以方便地寫回調了。請看下面的例子。

var array = [1, 2, 3]; //傳統寫法 array.forEach(function(v, i, a) {console.log(v); }); //ES6 array.forEach(v = > console.log(v));

大家可以打開文章開頭提到的traceur在線代碼轉譯頁面輸入代碼來查看效果。

類的支持

ES6中添加了對類的支持,引入了class關鍵字(其實class在JavaScript中一直是保留字,目的就是考慮到可能在以后的新版本中會用到,現在終于派上用場了)。JS本身就是面向對象的,ES6中提供的類實際上只是JS原型模式的包裝。現在提供原生的class支持后,對象的創建,繼承更加直觀了,并且父類方法的調用,實例化,靜態方法和構造函數等概念都更加形象化。

下面代碼展示了類在ES6中的使用。再次啰嗦一句,你可以將代碼貼到traceur自己查看運行結果。

//類的定義 class Animal {//ES6中新型構造器constructor(name) {this.name = name;}//實例方法sayName() {console.log('My name is '+this.name);} } //類的繼承 class Programmer extends Animal {constructor(name) {//直接調用父類構造器進行初始化super(name);}program() {console.log("I'm coding...");} } //測試我們的類 var animal=new Animal('dummy'), wayou=new Programmer('wayou'); animal.sayName();//輸出 ‘My name is dummy’ wayou.sayName();//輸出 ‘My name is wayou’ wayou.program();//輸出 ‘I'm coding...’

?

增強的對象字面量

對象字面量被增強了,寫法更加簡潔與靈活,同時在定義對象的時候能夠做的事情更多了。具體表現在:

  • 可以在對象字面量里面定義原型
  • 定義方法可以不用function關鍵字
  • 直接調用父類方法

這樣一來,對象字面量與前面提到的類概念更加吻合,在編寫面向對象的JavaScript時更加輕松方便了。

//通過對象字面量創建對象 var human = {breathe() {console.log('breathing...');} }; var worker = {__proto__: human, //設置此對象的原型為human,相當于繼承humancompany: 'freelancer',work() {console.log('working...');} }; human.breathe();//輸出 ‘breathing...’ //調用繼承來的breathe方法 worker.breathe();//輸出 ‘breathing...’

?

字符串模板

字符串模板相對簡單易懂些。ES6中允許使用反引號?`?來創建字符串,此種方法創建的字符串里面可以包含由美元符號加花括號包裹的變量${vraible}。如果你使用過像C#等后端強類型語言的話,對此功能應該不會陌生。

//產生一個隨機數 var num=Math.random(); //將這個數字輸出到console console.log(`your num is ${num}`);

解構

自動解析數組或對象中的值。比如若一個函數要返回多個值,常規的做法是返回一個對象,將每個值做為這個對象的屬性返回。但在ES6中,利用解構這一特性,可以直接返回一個數組,然后數組中的值會自動被解析到對應接收該值的變量中。

var [x,y]=getVal(),//函數返回值的解構[name,,age]=['wayou','male','secrect'];//數組解構function getVal() {return [ 1, 2 ]; }console.log('x:'+x+', y:'+y);//輸出:x:1, y:2 console.log('name:'+name+', age:'+age);//輸出: name:wayou, age:secrect

參數默認值,不定參數,拓展參數

默認參數值

現在可以在定義函數的時候指定參數的默認值了,而不用像以前那樣通過邏輯或操作符來達到目的了。

function sayHello(name){//傳統的指定默認參數的方式var name=name||'dude';console.log('Hello '+name); } //運用ES6的默認參數 function sayHello2(name='dude'){console.log(`Hello ${name}`); } sayHello();//輸出:Hello dude sayHello('Wayou');//輸出:Hello Wayou sayHello2();//輸出:Hello dude sayHello2('Wayou');//輸出:Hello Wayou

?

不定參數

不定參數是在函數中使用命名參數同時接收不定數量的未命名參數。這只是一種語法糖,在以前的JavaScript代碼中我們可以通過arguments變量來達到這一目的。不定參數的格式是三個句點后跟代表所有不定參數的變量名。比如下面這個例子中,…x代表了所有傳入add函數的參數。

//將所有參數相加的函數 function add(...x){return x.reduce((m,n)=>m+n); } //傳遞任意個數的參數 console.log(add(1,2,3));//輸出:6 console.log(add(1,2,3,4,5));//輸出:15

?

拓展參數

拓展參數則是另一種形式的語法糖,它允許傳遞數組或者類數組直接做為函數的參數而不用通過apply。

var people=['Wayou','John','Sherlock']; //sayHello函數本來接收三個單獨的參數人妖,人二和人三 function sayHello(people1,people2,people3){console.log(`Hello ${people1},${people2},${people3}`); } //但是我們將一個數組以拓展參數的形式傳遞,它能很好地映射到每個單獨的參數 sayHello(...people);//輸出:Hello Wayou,John,Sherlock //而在以前,如果需要傳遞數組當參數,我們需要使用函數的apply方法 sayHello.apply(null,people);//輸出:Hello Wayou,John,Sherlock

let與const 關鍵字

可以把let看成var,只是它定義的變量被限定在了特定范圍內才能使用,而離開這個范圍則無效。const則很直觀,用來定義常量,即無法被更改值的變量。

for (let i=0;i<2;i++)console.log(i);//輸出: 0,1 console.log(i);//輸出:undefined,嚴格模式下會報錯

for of 值遍歷

我們都知道for in?循環用于遍歷數組,類數組或對象,ES6中新引入的for of循環功能相似,不同的是每次循環它提供的不是序號而是值。

var someArray = [ "a", "b", "c" ];for (v of someArray) {console.log(v);//輸出 a,b,c }

注意,此功能google traceur并未實現,所以無法模擬調試,下面有些功能也是如此

iterator, generator

這一部分的內容有點生澀,詳情可以參見這里。以下是些基本概念。

  • iterator:它是這么一個對象,擁有一個next方法,這個方法返回一個對象{done,value},這個對象包含兩個屬性,一個布爾類型的done和包含任意值的value
  • iterable: 這是這么一個對象,擁有一個obj[@@iterator]方法,這個方法返回一個iterator
  • generator: 它是一種特殊的iterator。反的next方法可以接收一個參數并且返回值取決與它的構造函數(generator function)。generator同時擁有一個throw方法
  • generator 函數: 即generator的構造函數。此函數內可以使用yield關鍵字。在yield出現的地方可以通過generator的next或throw方法向外界傳遞值。generator 函數是通過function*來聲明的
  • yield 關鍵字:它可以暫停函數的執行,隨后可以再進進入函數繼續執行

模塊

在ES6標準中,JavaScript原生支持module了。這種將JS代碼分割成不同功能的小塊進行模塊化的概念是在一些三方規范中流行起來的,比如CommonJS和AMD模式。

將不同功能的代碼分別寫在不同文件中,各模塊只需導出公共接口部分,然后通過模塊的導入的方式可以在其他地方使用。下面的例子來自tutsplus:

// point.js module "point" {export class Point {constructor (x, y) {public x = x;public y = y;}} }// myapp.js //聲明引用的模塊 module point from "/point.js"; //這里可以看出,盡管聲明了引用的模塊,還是可以通過指定需要的部分進行導入 import Point from "point";var origin = new Point(0, 0); console.log(origin);

Map,Set 和 WeakMap,WeakSet

這些是新加的集合類型,提供了更加方便的獲取屬性值的方法,不用像以前一樣用hasOwnProperty來檢查某個屬性是屬于原型鏈上的呢還是當前對象的。同時,在進行屬性值添加與獲取時有專門的get,set?方法。

下方代碼來自es6feature

// Sets var s = new Set(); s.add("hello").add("goodbye").add("hello"); s.size === 2; s.has("hello") === true;// Maps var m = new Map(); m.set("hello", 42); m.set(s, 34); m.get(s) == 34;

有時候我們會把對象作為一個對象的鍵用來存放屬性值,普通集合類型比如簡單對象會阻止垃圾回收器對這些作為屬性鍵存在的對象的回收,有造成內存泄漏的危險。而WeakMap,WeakSet則更加安全些,這些作為屬性鍵的對象如果沒有別的變量在引用它們,則會被回收釋放掉,具體還看下面的例子。

正文代碼來自es6feature

// Weak Maps var wm = new WeakMap(); wm.set(s, { extra: 42 }); wm.size === undefined// Weak Sets var ws = new WeakSet(); ws.add({ data: 42 });//因為添加到ws的這個臨時對象沒有其他變量引用它,所以ws不會保存它的值,也就是說這次添加其實沒有意思

?

Proxies

Proxy可以監聽對象身上發生了什么事情,并在這些事情發生后執行一些相應的操作。一下子讓我們對一個對象有了很強的追蹤能力,同時在數據綁定方面也很有用處。

以下例子借用自這里。

//定義被偵聽的目標對象 var engineer = { name: 'Joe Sixpack', salary: 50 }; //定義處理程序 var interceptor = {set: function (receiver, property, value) {console.log(property, 'is changed to', value);receiver[property] = value;} }; //創建代理以進行偵聽 engineer = Proxy(engineer, interceptor); //做一些改動來觸發代理 engineer.salary = 60;//控制臺輸出:salary is changed to 60

上面代碼我已加了注釋,這里進一步解釋。對于處理程序,是在被偵聽的對象身上發生了相應事件之后,處理程序里面的方法就會被調用,上面例子中我們設置了set的處理函數,表明,如果我們偵聽的對象的屬性被更改,也就是被set了,那這個處理程序就會被調用,同時通過參數能夠得知是哪個屬性被更改,更改為了什么值。

Symbols

我們知道對象其實是鍵值對的集合,而鍵通常來說是字符串。而現在除了字符串外,我們還可以用symbol這種值來做為對象的鍵。Symbol是一種基本類型,像數字,字符串還有布爾一樣,它不是一個對象。Symbol 通過調用symbol函數產生,它接收一個可選的名字參數,該函數返回的symbol是唯一的。之后就可以用這個返回值做為對象的鍵了。Symbol還可以用來創建私有屬性,外部無法直接訪問由symbol做為鍵的屬性值。

以下例子來自es6features

(function() {// 創建symbolvar key = Symbol("key");function MyClass(privateData) {this[key] = privateData;}MyClass.prototype = {doStuff: function() {... this[key] ...}};})();var c = new MyClass("hello") c["key"] === undefined//無法訪問該屬性,因為是私有的

?

Math,Number,String,Object 的新API

對Math,Number,String還有Object等添加了許多新的API。下面代碼同樣來自es6features,對這些新API進行了簡單展示。

Number.EPSILON Number.isInteger(Infinity) // false Number.isNaN("NaN") // falseMath.acosh(3) // 1.762747174039086 Math.hypot(3, 4) // 5 Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2"abcde".contains("cd") // true "abc".repeat(3) // "abcabcabc"Array.from(document.querySelectorAll('*')) // Returns a real Array Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior [0, 0, 0].fill(7, 1) // [0,7,7] [1,2,3].findIndex(x => x == 2) // 1 ["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"] ["a", "b", "c"].keys() // iterator 0, 1, 2 ["a", "b", "c"].values() // iterator "a", "b", "c"Object.assign(Point, { origin: new Point(0,0) })

?

Promises

Promises是處理異步操作的一種模式,之前在很多三方庫中有實現,比如jQuery的deferred?對象。當你發起一個異步請求,并綁定了.when(),?.done()等事件處理程序時,其實就是在應用promise模式。

//創建promise var promise = new Promise(function(resolve, reject) {// 進行一些異步或耗時操作if ( /*如果成功 */ ) {resolve("Stuff worked!");} else {reject(Error("It broke"));} }); //綁定處理程序 promise.then(function(result) {//promise成功的話會執行這里console.log(result); // "Stuff worked!" }, function(err) {//promise失敗會執行這里console.log(err); // Error: "It broke" });

總結

總結就是一句話,前后端差異越來越小了。

<div id="topics"><div class="post"><h1 class="postTitle"><a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/Wayou/p/es6_new_features.html">ES6新特性概覽</a></h1><div class="clear"></div><div class="postBody"><div id="cnblogs_post_body" class="blogpost-body"><p>本文基于<a href="https://github.com/lukehoban" target="_blank">lukehoban</a>/<a href="https://github.com/lukehoban/es6features" target="_blank"><strong>es6features</strong></a> ,同時參考了大量博客資料,具體見文末引用。</p><p>ES6(<a href="https://www.google.com/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0CCoQFjAA&amp;url=%68%74%74%70%3a%2f%2f%65%6e%2e%77%69%6b%69%70%65%64%69%61%2e%6f%72%67%2f%77%69%6b%69%2f%45%43%4d%41%53%63%72%69%70%74&amp;ei=Q99JU5jwAoGC8gWq9YDoCQ&amp;usg=AFQjCNGgS-TjEL_-efubqc1RnkUfmn6wew&amp;sig2=Kx2DkQ1Qtv0Wu2E_v_fwGQ&amp;bvm=bv.64542518,d.dGc" target="_blank">ECMAScript</a> 6)是即將到來的新版本JavaScript語言的標準,代號harmony(和諧之意,顯然沒有跟上我國的步伐,我們已經進入中國夢版本了)。上一次標準的制訂還是2009年出臺的ES5。目前ES6的標準化工作正在進行中,預計會在14年12月份放出正式敲定的版本。但大部分標準已經就緒,且各瀏覽器對ES6的支持也正在實現中。要查看ES6的支持情況請<a href="http://kangax.github.io/es5-compat-table/es6/" target="_blank">點此</a>。</p><p>目前想要運行ES6代碼的話,可以用<a href="https://github.com/google" target="_blank">google</a>/<a href="https://github.com/google/traceur-compiler" target="_blank"><strong>traceur-compiler</strong></a>將代碼轉譯。<a href="http://google.github.io/traceur-compiler/demo/repl.html" target="_blank">點此</a>訪問traceur-compiler 在線版本時實編輯ES6代碼并查看轉換后的結果,代碼運行結果會在console顯示。</p><p>另外,關于Google Traceur,業界大神<a href="https://plus.google.com/+AddyOsmani" target="_blank">Addy Osmani</a>利用前者寫了個Chrome插件<a href="https://chrome.google.com/webstore/detail/es6-repl/alploljligeomonipppgaahpkenfnfkn" target="_blank">ES6 Tepl</a>,安裝后也可以進行ES6的測試。</p><p>當然,并不是所有ES6新特性都被實現了,所以上面的方法可以測試大部分,有一些還是無法測試的。</p><p>雖然ES6都還沒真正發布,但已經有用<a href="http://blog.tastejs.com/rewriting-a-webapp-with-ecmascript-6" target="_blank">ES6重寫的程序</a>了,各種關于ES789的提議已經開始了,這你敢信。潮流不是我等大眾所能追趕的。</p><p>潮流雖然太快,但我們不停下學習的步伐,就不會被潮流丟下的,下面來領略下ES6中新特性,一堵新生代JS的風采。</p><h1>箭頭操作符</h1><p>如果你會C#或者Java,你肯定知道lambda表達式,ES6中新增的箭頭操作符<span style="background-color: lightgrey;">=&gt;</span>便有異曲同工之妙。它簡化了函數的書寫。操作符左邊為輸入的參數,而右邊則是進行的操作以及返回的值<span style="background-color: lightgrey;">Inputs=&gt;outputs</span>。</p><p>我們知道在JS中回調是經常的事,而一般回調又以匿名函數的形式出現,每次都需要寫一個<span style="background-color: lightgrey;">function</span>,甚是繁瑣。當引入箭頭操作符后可以方便地寫回調了。請看下面的例子。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">array</span> <span style="color: #f92672;">=</span> <span style="color: #f8f8f2;">[</span><span style="color: #ae81ff;">1</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">3</span><span style="color: #f8f8f2;">];</span><span style="color: #75715e;">//傳統寫法</span><span style="color: #a6e22e;">array</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">forEach</span><span style="color: #f8f8f2;">(</span><span style="color: #66d9ef;">function</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">v</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">i</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">a</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">v</span><span style="color: #f8f8f2;">);</span><span style="color: #f8f8f2;">});</span><span style="color: #75715e;">//ES6</span><span style="color: #a6e22e;">array</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">forEach</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">v</span> <span style="color: #f92672;">=</span> <span style="color: #f92672;">&gt;</span> <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">v</span><span style="color: #f8f8f2;">));</span></pre></div><p>大家可以打開文章開頭提到的traceur在線代碼轉譯頁面輸入代碼來查看效果。</p><h1>類的支持</h1><p>ES6中添加了對類的支持,引入了<span style="background-color: lightgrey;">class</span>關鍵字(其實class在JavaScript中一直是保留字,目的就是考慮到可能在以后的新版本中會用到,現在終于派上用場了)。JS本身就是面向對象的,ES6中提供的類實際上只是JS原型模式的包裝。現在提供原生的class支持后,對象的創建,繼承更加直觀了,并且父類方法的調用,實例化,靜態方法和構造函數等概念都更加形象化。</p><p>下面代碼展示了類在ES6中的使用。再次啰嗦一句,你可以將代碼貼到<a href="http://google.github.io/traceur-compiler/demo/repl.html" target="_blank">traceur</a>自己查看運行結果。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">//類的定義</span><span style="color: #66d9ef;">class</span> <span style="color: #a6e22e;">Animal</span> <span style="color: #f8f8f2;">{</span><span style="color: #75715e;">//ES6中新型構造器</span>? ? <span style="color: #a6e22e;">constructor</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? ? ? <span style="color: #66d9ef;">this</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">name</span> <span style="color: #f92672;">=</span> <span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">;</span>? ? <span style="color: #f8f8f2;">}</span>? ? <span style="color: #75715e;">//實例方法</span>? ? <span style="color: #a6e22e;">sayName</span><span style="color: #f8f8f2;">()</span> <span style="color: #f8f8f2;">{</span>? ? ? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'My name is '</span><span style="color: #f92672;">+</span><span style="color: #66d9ef;">this</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">);</span>? ? <span style="color: #f8f8f2;">}</span><span style="color: #f8f8f2;">}</span><span style="color: #75715e;">//類的繼承</span><span style="color: #66d9ef;">class</span> <span style="color: #a6e22e;">Programmer</span> <span style="color: #66d9ef;">extends</span> <span style="color: #a6e22e;">Animal</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #a6e22e;">constructor</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #75715e;">//直接調用父類構造器進行初始化</span>? ? ? ? <span style="color: #66d9ef;">super</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">);</span>? ? <span style="color: #f8f8f2;">}</span>? ? <span style="color: #a6e22e;">program</span><span style="color: #f8f8f2;">()</span> <span style="color: #f8f8f2;">{</span>? ? ? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"I'm coding..."</span><span style="color: #f8f8f2;">);</span>? ? <span style="color: #f8f8f2;">}</span><span style="color: #f8f8f2;">}</span><span style="color: #75715e;">//測試我們的類</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">animal</span><span style="color: #f92672;">=</span><span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">Animal</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'dummy'</span><span style="color: #f8f8f2;">),</span><span style="color: #a6e22e;">wayou</span><span style="color: #f92672;">=</span><span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">Programmer</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'wayou'</span><span style="color: #f8f8f2;">);</span><span style="color: #a6e22e;">animal</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">sayName</span><span style="color: #f8f8f2;">();</span><span style="color: #75715e;">//輸出 ‘My name is dummy’</span><span style="color: #a6e22e;">wayou</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">sayName</span><span style="color: #f8f8f2;">();</span><span style="color: #75715e;">//輸出 ‘My name is wayou’</span><span style="color: #a6e22e;">wayou</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">program</span><span style="color: #f8f8f2;">();</span><span style="color: #75715e;">//輸出 ‘I'm coding...’</span></pre></div><p>&nbsp;</p><h1>增強的對象字面量</h1><p>對象字面量被增強了,寫法更加簡潔與靈活,同時在定義對象的時候能夠做的事情更多了。具體表現在:</p><ul><li>可以在對象字面量里面定義原型</li><li>定義方法可以不用function關鍵字</li><li>直接調用父類方法</li></ul><p>這樣一來,對象字面量與前面提到的類概念更加吻合,在編寫面向對象的JavaScript時更加輕松方便了。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">//通過對象字面量創建對象</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">human</span> <span style="color: #f92672;">=</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #a6e22e;">breathe</span><span style="color: #f8f8f2;">()</span> <span style="color: #f8f8f2;">{</span>? ? ? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'breathing...'</span><span style="color: #f8f8f2;">);</span>? ? <span style="color: #f8f8f2;">}</span><span style="color: #f8f8f2;">};</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">worker</span> <span style="color: #f92672;">=</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #a6e22e;">__proto__</span><span style="color: #f92672;">:</span> <span style="color: #a6e22e;">human</span><span style="color: #f8f8f2;">,</span> <span style="color: #75715e;">//設置此對象的原型為human,相當于繼承human</span>? ? <span style="color: #a6e22e;">company</span><span style="color: #f92672;">:</span> <span style="color: #e6db74;">'freelancer'</span><span style="color: #f8f8f2;">,</span>? ? <span style="color: #a6e22e;">work</span><span style="color: #f8f8f2;">()</span> <span style="color: #f8f8f2;">{</span>? ? ? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'working...'</span><span style="color: #f8f8f2;">);</span>? ? <span style="color: #f8f8f2;">}</span><span style="color: #f8f8f2;">};</span><span style="color: #a6e22e;">human</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">breathe</span><span style="color: #f8f8f2;">();</span><span style="color: #75715e;">//輸出 ‘breathing...’</span><span style="color: #75715e;">//調用繼承來的breathe方法</span><span style="color: #a6e22e;">worker</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">breathe</span><span style="color: #f8f8f2;">();</span><span style="color: #75715e;">//輸出 ‘breathing...’</span></pre></div><p>&nbsp;</p><h1>字符串模板</h1><p>字符串模板相對簡單易懂些。ES6中允許使用反引號 <span style="background-color: lightgrey;">`</span> 來創建字符串,此種方法創建的字符串里面可以包含由美元符號加花括號包裹的變量<span style="background-color: lightgrey;">${vraible}</span>。如果你使用過像C#等后端強類型語言的話,對此功能應該不會陌生。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">//產生一個隨機數</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">num</span><span style="color: #f92672;">=</span><span style="color: #f8f8f2;">Math.</span><span style="color: #a6e22e;">random</span><span style="color: #f8f8f2;">();</span><span style="color: #75715e;">//將這個數字輸出到console</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #960050; background-color: #1e0010;">`</span><span style="color: #a6e22e;">your</span> <span style="color: #a6e22e;">num</span> <span style="color: #a6e22e;">is</span> <span style="color: #a6e22e;">$</span><span style="color: #f8f8f2;">{</span><span style="color: #a6e22e;">num</span><span style="color: #f8f8f2;">}</span><span style="color: #960050; background-color: #1e0010;">`</span><span style="color: #f8f8f2;">);</span></pre></div><h1>解構</h1><p>自動解析數組或對象中的值。比如若一個函數要返回多個值,常規的做法是返回一個對象,將每個值做為這個對象的屬性返回。但在ES6中,利用解構這一特性,可以直接返回一個數組,然后數組中的值會自動被解析到對應接收該值的變量中。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #66d9ef;">var</span> <span style="color: #f8f8f2;">[</span><span style="color: #a6e22e;">x</span><span style="color: #f8f8f2;">,</span><span style="color: #a6e22e;">y</span><span style="color: #f8f8f2;">]</span><span style="color: #f92672;">=</span><span style="color: #a6e22e;">getVal</span><span style="color: #f8f8f2;">(),</span><span style="color: #75715e;">//函數返回值的解構</span>? ? <span style="color: #f8f8f2;">[</span><span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">,,</span><span style="color: #a6e22e;">age</span><span style="color: #f8f8f2;">]</span><span style="color: #f92672;">=</span><span style="color: #f8f8f2;">[</span><span style="color: #e6db74;">'wayou'</span><span style="color: #f8f8f2;">,</span><span style="color: #e6db74;">'male'</span><span style="color: #f8f8f2;">,</span><span style="color: #e6db74;">'secrect'</span><span style="color: #f8f8f2;">];</span><span style="color: #75715e;">//數組解構</span>
<span style="color: #66d9ef;">function</span> <span style="color: #a6e22e;">getVal</span><span style="color: #f8f8f2;">()</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #66d9ef;">return</span> <span style="color: #f8f8f2;">[</span> <span style="color: #ae81ff;">1</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">2</span> <span style="color: #f8f8f2;">];</span><span style="color: #f8f8f2;">}</span>
<span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'x:'</span><span style="color: #f92672;">+</span><span style="color: #a6e22e;">x</span><span style="color: #f92672;">+</span><span style="color: #e6db74;">', y:'</span><span style="color: #f92672;">+</span><span style="color: #a6e22e;">y</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出:x:1, y:2 </span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'name:'</span><span style="color: #f92672;">+</span><span style="color: #a6e22e;">name</span><span style="color: #f92672;">+</span><span style="color: #e6db74;">', age:'</span><span style="color: #f92672;">+</span><span style="color: #a6e22e;">age</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出: name:wayou, age:secrect </span></pre></div><h1>參數默認值,不定參數,拓展參數</h1><h2>默認參數值</h2><p>現在可以在定義函數的時候指定參數的默認值了,而不用像以前那樣通過邏輯或操作符來達到目的了。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #66d9ef;">function</span> <span style="color: #a6e22e;">sayHello</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">){</span><span style="color: #75715e;">//傳統的指定默認參數的方式</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">name</span><span style="color: #f92672;">=</span><span style="color: #a6e22e;">name</span><span style="color: #f92672;">||</span><span style="color: #e6db74;">'dude'</span><span style="color: #f8f8f2;">;</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'Hello '</span><span style="color: #f92672;">+</span><span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">);</span><span style="color: #f8f8f2;">}</span><span style="color: #75715e;">//運用ES6的默認參數</span><span style="color: #66d9ef;">function</span> <span style="color: #a6e22e;">sayHello2</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">name</span><span style="color: #f92672;">=</span><span style="color: #e6db74;">'dude'</span><span style="color: #f8f8f2;">){</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #960050; background-color: #1e0010;">`</span><span style="color: #a6e22e;">Hello</span> <span style="color: #a6e22e;">$</span><span style="color: #f8f8f2;">{</span><span style="color: #a6e22e;">name</span><span style="color: #f8f8f2;">}</span><span style="color: #960050; background-color: #1e0010;">`</span><span style="color: #f8f8f2;">);</span><span style="color: #f8f8f2;">}</span><span style="color: #a6e22e;">sayHello</span><span style="color: #f8f8f2;">();</span><span style="color: #75715e;">//輸出:Hello dude</span><span style="color: #a6e22e;">sayHello</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'Wayou'</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出:Hello Wayou</span><span style="color: #a6e22e;">sayHello2</span><span style="color: #f8f8f2;">();</span><span style="color: #75715e;">//輸出:Hello dude</span><span style="color: #a6e22e;">sayHello2</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'Wayou'</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出:Hello Wayou</span></pre></div><p>&nbsp;</p><h2>不定參數</h2><p>不定參數是在函數中使用命名參數同時接收不定數量的未命名參數。這只是一種語法糖,在以前的JavaScript代碼中我們可以通過arguments變量來達到這一目的。不定參數的格式是三個句點后跟代表所有不定參數的變量名。比如下面這個例子中,<span style="background-color: lightgrey;">…x</span>代表了所有傳入<span style="background-color: lightgrey;">add</span>函數的參數。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">//將所有參數相加的函數</span><span style="color: #66d9ef;">function</span> <span style="color: #a6e22e;">add</span><span style="color: #f8f8f2;">(...</span><span style="color: #a6e22e;">x</span><span style="color: #f8f8f2;">){</span><span style="color: #66d9ef;">return</span> <span style="color: #a6e22e;">x</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">reduce</span><span style="color: #f8f8f2;">((</span><span style="color: #a6e22e;">m</span><span style="color: #f8f8f2;">,</span><span style="color: #a6e22e;">n</span><span style="color: #f8f8f2;">)</span><span style="color: #f92672;">=&gt;</span><span style="color: #a6e22e;">m</span><span style="color: #f92672;">+</span><span style="color: #a6e22e;">n</span><span style="color: #f8f8f2;">);</span><span style="color: #f8f8f2;">}</span><span style="color: #75715e;">//傳遞任意個數的參數</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">add</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">1</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">3</span><span style="color: #f8f8f2;">));</span><span style="color: #75715e;">//輸出:6</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">add</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">1</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">3</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">4</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">5</span><span style="color: #f8f8f2;">));</span><span style="color: #75715e;">//輸出:15</span></pre></div><p>&nbsp;</p><h2>拓展參數</h2><p>拓展參數則是另一種形式的語法糖,它允許傳遞數組或者類數組直接做為函數的參數而不用通過<span style="background-color: lightgrey;">apply</span>。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">people</span><span style="color: #f92672;">=</span><span style="color: #f8f8f2;">[</span><span style="color: #e6db74;">'Wayou'</span><span style="color: #f8f8f2;">,</span><span style="color: #e6db74;">'John'</span><span style="color: #f8f8f2;">,</span><span style="color: #e6db74;">'Sherlock'</span><span style="color: #f8f8f2;">];</span><span style="color: #75715e;">//sayHello函數本來接收三個單獨的參數人妖,人二和人三</span><span style="color: #66d9ef;">function</span> <span style="color: #a6e22e;">sayHello</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">people1</span><span style="color: #f8f8f2;">,</span><span style="color: #a6e22e;">people2</span><span style="color: #f8f8f2;">,</span><span style="color: #a6e22e;">people3</span><span style="color: #f8f8f2;">){</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #960050; background-color: #1e0010;">`</span><span style="color: #a6e22e;">Hello</span> <span style="color: #a6e22e;">$</span><span style="color: #f8f8f2;">{</span><span style="color: #a6e22e;">people1</span><span style="color: #f8f8f2;">},</span><span style="color: #a6e22e;">$</span><span style="color: #f8f8f2;">{</span><span style="color: #a6e22e;">people2</span><span style="color: #f8f8f2;">},</span><span style="color: #a6e22e;">$</span><span style="color: #f8f8f2;">{</span><span style="color: #a6e22e;">people3</span><span style="color: #f8f8f2;">}</span><span style="color: #960050; background-color: #1e0010;">`</span><span style="color: #f8f8f2;">);</span><span style="color: #f8f8f2;">}</span><span style="color: #75715e;">//但是我們將一個數組以拓展參數的形式傳遞,它能很好地映射到每個單獨的參數</span><span style="color: #a6e22e;">sayHello</span><span style="color: #f8f8f2;">(...</span><span style="color: #a6e22e;">people</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出:Hello Wayou,John,Sherlock </span>
<span style="color: #75715e;">//而在以前,如果需要傳遞數組當參數,我們需要使用函數的apply方法</span><span style="color: #a6e22e;">sayHello</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">apply</span><span style="color: #f8f8f2;">(</span><span style="color: #66d9ef;">null</span><span style="color: #f8f8f2;">,</span><span style="color: #a6e22e;">people</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出:Hello Wayou,John,Sherlock </span></pre></div><h1>let與const 關鍵字</h1><p>可以把<span style="background-color: lightgrey;">let</span>看成<span style="background-color: lightgrey;">var</span>,只是它定義的變量被限定在了特定范圍內才能使用,而離開這個范圍則無效。<span style="background-color: lightgrey;">const</span>則很直觀,用來定義常量,即無法被更改值的變量。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #66d9ef;">for</span> <span style="color: #f8f8f2;">(</span><span style="color: #66d9ef;">let</span> <span style="color: #a6e22e;">i</span><span style="color: #f92672;">=</span><span style="color: #ae81ff;">0</span><span style="color: #f8f8f2;">;</span><span style="color: #a6e22e;">i</span><span style="color: #f92672;">&lt;</span><span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">;</span><span style="color: #a6e22e;">i</span><span style="color: #f92672;">++</span><span style="color: #f8f8f2;">)</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">i</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出: 0,1</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">i</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出:undefined,嚴格模式下會報錯</span></pre></div><h1>for of 值遍歷</h1><p>我們都知道<span style="background-color: lightgrey;">for in</span> 循環用于遍歷數組,類數組或對象,ES6中新引入的<span style="background-color: lightgrey;">for of</span>循環功能相似,不同的是每次循環它提供的不是序號而是值。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">someArray</span> <span style="color: #f92672;">=</span> <span style="color: #f8f8f2;">[</span> <span style="color: #e6db74;">"a"</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">"b"</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">"c"</span> <span style="color: #f8f8f2;">];</span>?<span style="color: #66d9ef;">for</span> <span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">v</span> <span style="color: #a6e22e;">of</span> <span style="color: #a6e22e;">someArray</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">v</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//輸出 a,b,c</span><span style="color: #f8f8f2;">}</span></pre></div><p class="emphasis_block"><em>注意,此功能google traceur并未實現,所以無法模擬調試,下面有些功能也是如此</em></p><h1>iterator, generator</h1><p>這一部分的內容有點生澀,詳情可以參見<a href="http://domenic.me/2013/09/06/es6-iterators-generators-and-iterables/" target="_blank">這里</a>。以下是些基本概念。</p><ul><li>iterator:它是這么一個對象,擁有一個next方法,這個方法返回一個對象{done,value},這個對象包含兩個屬性,一個布爾類型的done和包含任意值的value</li><li>iterable: 這是這么一個對象,擁有一個obj[@@iterator]方法,這個方法返回一個iterator</li><li>generator: 它是一種特殊的iterator。反的next方法可以接收一個參數并且返回值取決與它的構造函數(generator function)。generator同時擁有一個throw方法</li><li>generator 函數: 即generator的構造函數。此函數內可以使用<span style="background-color: lightgrey;">yield</span>關鍵字。在<span style="background-color: lightgrey;">yield</span>出現的地方可以通過generator的<span style="background-color: lightgrey;">next</span>或<span style="background-color: lightgrey;">throw</span>方法向外界傳遞值。generator 函數是通過<span style="background-color: lightgrey;">function*</span>來聲明的</li><li>yield 關鍵字:它可以暫停函數的執行,隨后可以再進進入函數繼續執行</li></ul><h1>模塊</h1><p>在ES6標準中,JavaScript原生支持module了。這種將JS代碼分割成不同功能的小塊進行模塊化的概念是在一些三方規范中流行起來的,比如CommonJS和AMD模式。</p><p>將不同功能的代碼分別寫在不同文件中,各模塊只需導出公共接口部分,然后通過模塊的導入的方式可以在其他地方使用。下面的例子來自<a href="http://code.tutsplus.com/tutorials/eight-cool-features-coming-in-es6--net-33175" target="_blank">tutsplus</a>:</p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">// point.js</span><span style="color: #a6e22e;">module</span> <span style="color: #e6db74;">"point"</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #66d9ef;">export</span> <span style="color: #66d9ef;">class</span> <span style="color: #a6e22e;">Point</span> <span style="color: #f8f8f2;">{</span>? ? ? ? <span style="color: #a6e22e;">constructor</span> <span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">x</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">y</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? ? ? ? ? <span style="color: #66d9ef;">public</span> <span style="color: #a6e22e;">x</span> <span style="color: #f92672;">=</span> <span style="color: #a6e22e;">x</span><span style="color: #f8f8f2;">;</span>? ? ? ? ? ? <span style="color: #66d9ef;">public</span> <span style="color: #a6e22e;">y</span> <span style="color: #f92672;">=</span> <span style="color: #a6e22e;">y</span><span style="color: #f8f8f2;">;</span>? ? ? ? <span style="color: #f8f8f2;">}</span>? ? <span style="color: #f8f8f2;">}</span><span style="color: #f8f8f2;">}</span>?<span style="color: #75715e;">// myapp.js</span><span style="color: #75715e;">//聲明引用的模塊</span><span style="color: #a6e22e;">module</span> <span style="color: #a6e22e;">point</span> <span style="color: #a6e22e;">from</span> <span style="color: #e6db74;">"/point.js"</span><span style="color: #f8f8f2;">;</span><span style="color: #75715e;">//這里可以看出,盡管聲明了引用的模塊,還是可以通過指定需要的部分進行導入</span><span style="color: #66d9ef;">import</span> <span style="color: #a6e22e;">Point</span> <span style="color: #a6e22e;">from</span> <span style="color: #e6db74;">"point"</span><span style="color: #f8f8f2;">;</span>?<span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">origin</span> <span style="color: #f92672;">=</span> <span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">Point</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">0</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">0</span><span style="color: #f8f8f2;">);</span><span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">origin</span><span style="color: #f8f8f2;">);</span></pre></div><h1>Map,Set 和 WeakMap,WeakSet</h1><p>這些是新加的集合類型,提供了更加方便的獲取屬性值的方法,不用像以前一樣用<span style="background-color: lightgrey;">hasOwnProperty</span>來檢查某個屬性是屬于原型鏈上的呢還是當前對象的。同時,在進行屬性值添加與獲取時有專門的<span style="background-color: lightgrey;">get</span>,<span style="background-color: lightgrey;">set</span> 方法。</p><p>下方代碼來自<a href="https://github.com/lukehoban/es6features" target="_blank">es6feature</a></p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">// Sets</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">s</span> <span style="color: #f92672;">=</span> <span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">Set</span><span style="color: #f8f8f2;">();</span><span style="color: #a6e22e;">s</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">add</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"hello"</span><span style="color: #f8f8f2;">).</span><span style="color: #a6e22e;">add</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"goodbye"</span><span style="color: #f8f8f2;">).</span><span style="color: #a6e22e;">add</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"hello"</span><span style="color: #f8f8f2;">);</span><span style="color: #a6e22e;">s</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">size</span> <span style="color: #f92672;">===</span> <span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">;</span><span style="color: #a6e22e;">s</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">has</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"hello"</span><span style="color: #f8f8f2;">)</span> <span style="color: #f92672;">===</span> <span style="color: #66d9ef;">true</span><span style="color: #f8f8f2;">;</span>
<span style="color: #75715e;">// Maps</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">m</span> <span style="color: #f92672;">=</span> <span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">Map</span><span style="color: #f8f8f2;">();</span><span style="color: #a6e22e;">m</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">set</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"hello"</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">42</span><span style="color: #f8f8f2;">);</span><span style="color: #a6e22e;">m</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">set</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">s</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">34</span><span style="color: #f8f8f2;">);</span><span style="color: #a6e22e;">m</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">get</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">s</span><span style="color: #f8f8f2;">)</span> <span style="color: #f92672;">==</span> <span style="color: #ae81ff;">34</span><span style="color: #f8f8f2;">;</span></pre></div><p>有時候我們會把對象作為一個對象的鍵用來存放屬性值,普通集合類型比如簡單對象會阻止垃圾回收器對這些作為屬性鍵存在的對象的回收,有造成內存泄漏的危險。而<span style="background-color: #c0c0c0;">WeakMap</span>,<span style="background-color: #c0c0c0;">WeakSet</span>則更加安全些,這些作為屬性鍵的對象如果沒有別的變量在引用它們,則會被回收釋放掉,具體還看下面的例子。</p><p>正文代碼來自<a href="https://github.com/lukehoban/es6features" target="_blank">es6feature</a></p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">// Weak Maps</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">wm</span> <span style="color: #f92672;">=</span> <span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">WeakMap</span><span style="color: #f8f8f2;">();</span><span style="color: #a6e22e;">wm</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">set</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">s</span><span style="color: #f8f8f2;">,</span> <span style="color: #f8f8f2;">{</span> <span style="color: #a6e22e;">extra</span><span style="color: #f92672;">:</span> <span style="color: #ae81ff;">42</span> <span style="color: #f8f8f2;">});</span><span style="color: #a6e22e;">wm</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">size</span> <span style="color: #f92672;">===</span> <span style="color: #66d9ef;">undefined</span>
<span style="color: #75715e;">// Weak Sets</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">ws</span> <span style="color: #f92672;">=</span> <span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">WeakSet</span><span style="color: #f8f8f2;">();</span><span style="color: #a6e22e;">ws</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">add</span><span style="color: #f8f8f2;">({</span> <span style="color: #a6e22e;">data</span><span style="color: #f92672;">:</span> <span style="color: #ae81ff;">42</span> <span style="color: #f8f8f2;">});</span><span style="color: #75715e;">//因為添加到ws的這個臨時對象沒有其他變量引用它,所以ws不會保存它的值,也就是說這次添加其實沒有意思</span></pre></div><p>&nbsp;</p><h1>Proxies</h1><p>Proxy可以監聽對象身上發生了什么事情,并在這些事情發生后執行一些相應的操作。一下子讓我們對一個對象有了很強的追蹤能力,同時在數據綁定方面也很有用處。</p><p>以下例子借用自<a href="http://ariya.ofilabs.com/2013/07/es6-and-proxy.html" target="_blank">這里</a>。<code><span style="color: #75715e;"><span style="color: #f8f8f2; font-family: 'Courier New'; line-height: 1.5;"><br></span></span></code></p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">//定義被偵聽的目標對象</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">engineer</span> <span style="color: #f92672;">=</span> <span style="color: #f8f8f2;">{</span> <span style="color: #a6e22e;">name</span><span style="color: #f92672;">:</span> <span style="color: #e6db74;">'Joe Sixpack'</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">salary</span><span style="color: #f92672;">:</span> <span style="color: #ae81ff;">50</span> <span style="color: #f8f8f2;">};</span><span style="color: #75715e;">//定義處理程序</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">interceptor</span> <span style="color: #f92672;">=</span> <span style="color: #f8f8f2;">{</span>? <span style="color: #a6e22e;">set</span><span style="color: #f92672;">:</span> <span style="color: #66d9ef;">function</span> <span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">receiver</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">property</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">value</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">property</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">'is changed to'</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">value</span><span style="color: #f8f8f2;">);</span>? ? <span style="color: #a6e22e;">receiver</span><span style="color: #f8f8f2;">[</span><span style="color: #a6e22e;">property</span><span style="color: #f8f8f2;">]</span> <span style="color: #f92672;">=</span> <span style="color: #a6e22e;">value</span><span style="color: #f8f8f2;">;</span>? <span style="color: #f8f8f2;">}</span><span style="color: #f8f8f2;">};</span><span style="color: #75715e;">//創建代理以進行偵聽</span><span style="color: #a6e22e;">engineer</span> <span style="color: #f92672;">=</span> <span style="color: #a6e22e;">Proxy</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">engineer</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">interceptor</span><span style="color: #f8f8f2;">);</span><span style="color: #75715e;">//做一些改動來觸發代理</span><span style="color: #a6e22e;">engineer</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">salary</span> <span style="color: #f92672;">=</span> <span style="color: #ae81ff;">60</span><span style="color: #f8f8f2;">;</span><span style="color: #75715e;">//控制臺輸出:salary is changed to 60</span></pre></div><p>上面代碼我已加了注釋,這里進一步解釋。對于處理程序,是在被偵聽的對象身上發生了相應事件之后,處理程序里面的方法就會被調用,上面例子中我們設置了<span style="background-color: lightgrey;">set</span>的處理函數,表明,如果我們偵聽的對象的屬性被更改,也就是被<span style="background-color: lightgrey;">set</span>了,那這個處理程序就會被調用,同時通過參數能夠得知是哪個屬性被更改,更改為了什么值。</p><h1>Symbols</h1><p>我們知道對象其實是鍵值對的集合,而鍵通常來說是字符串。而現在除了字符串外,我們還可以用symbol這種值來做為對象的鍵。Symbol是一種基本類型,像數字,字符串還有布爾一樣,它不是一個對象。Symbol 通過調用symbol函數產生,它接收一個可選的名字參數,該函數返回的symbol是唯一的。之后就可以用這個返回值做為對象的鍵了。Symbol還可以用來創建私有屬性,外部無法直接訪問由symbol做為鍵的屬性值。</p><p>以下例子來自<a href="https://github.com/lukehoban/es6features" target="_blank">es6features</a></p><div class="highlight" style="background: #272822;"><pre><span style="color: #f8f8f2;">(</span><span style="color: #66d9ef;">function</span><span style="color: #f8f8f2;">()</span> <span style="color: #f8f8f2;">{</span>
? <span style="color: #75715e;">// 創建symbol</span>? <span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">key</span> <span style="color: #f92672;">=</span> <span style="color: #a6e22e;">Symbol</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"key"</span><span style="color: #f8f8f2;">);</span>
? <span style="color: #66d9ef;">function</span> <span style="color: #a6e22e;">MyClass</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">privateData</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #66d9ef;">this</span><span style="color: #f8f8f2;">[</span><span style="color: #a6e22e;">key</span><span style="color: #f8f8f2;">]</span> <span style="color: #f92672;">=</span> <span style="color: #a6e22e;">privateData</span><span style="color: #f8f8f2;">;</span>? <span style="color: #f8f8f2;">}</span>
? <span style="color: #a6e22e;">MyClass</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">prototype</span> <span style="color: #f92672;">=</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #a6e22e;">doStuff</span><span style="color: #f92672;">:</span> <span style="color: #66d9ef;">function</span><span style="color: #f8f8f2;">()</span> <span style="color: #f8f8f2;">{</span>? ? ? <span style="color: #f8f8f2;">...</span> <span style="color: #66d9ef;">this</span><span style="color: #f8f8f2;">[</span><span style="color: #a6e22e;">key</span><span style="color: #f8f8f2;">]</span> <span style="color: #f8f8f2;">...</span>? ? <span style="color: #f8f8f2;">}</span>? <span style="color: #f8f8f2;">};</span>
<span style="color: #f8f8f2;">})();</span>
<span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">c</span> <span style="color: #f92672;">=</span> <span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">MyClass</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"hello"</span><span style="color: #f8f8f2;">)</span><span style="color: #a6e22e;">c</span><span style="color: #f8f8f2;">[</span><span style="color: #e6db74;">"key"</span><span style="color: #f8f8f2;">]</span> <span style="color: #f92672;">===</span> <span style="color: #66d9ef;">undefined</span><span style="color: #75715e;">//無法訪問該屬性,因為是私有的</span></pre></div><p>&nbsp;</p><h1>Math,Number,String,Object 的新API</h1><p>對Math,Number,String還有Object等添加了許多新的API。下面代碼同樣來自es6features,對這些新API進行了簡單展示。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #f8f8f2;">Number.</span><span style="color: #a6e22e;">EPSILON</span><span style="color: #f8f8f2;">Number.</span><span style="color: #a6e22e;">isInteger</span><span style="color: #f8f8f2;">(</span><span style="color: #66d9ef;">Infinity</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// false</span><span style="color: #f8f8f2;">Number.isNaN(</span><span style="color: #e6db74;">"NaN"</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// false</span>
<span style="color: #f8f8f2;">Math.</span><span style="color: #a6e22e;">acosh</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">3</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// 1.762747174039086</span><span style="color: #f8f8f2;">Math.</span><span style="color: #a6e22e;">hypot</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">3</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">4</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// 5</span><span style="color: #f8f8f2;">Math.</span><span style="color: #a6e22e;">imul</span><span style="color: #f8f8f2;">(Math.</span><span style="color: #a6e22e;">pow</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">32</span><span style="color: #f8f8f2;">)</span> <span style="color: #f92672;">-</span> <span style="color: #ae81ff;">1</span><span style="color: #f8f8f2;">,</span> <span style="color: #f8f8f2;">Math.</span><span style="color: #a6e22e;">pow</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">32</span><span style="color: #f8f8f2;">)</span> <span style="color: #f92672;">-</span> <span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// 2</span>
<span style="color: #e6db74;">"abcde"</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">contains</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"cd"</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// true</span><span style="color: #e6db74;">"abc"</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">repeat</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">3</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// "abcabcabc"</span>
<span style="color: #f8f8f2;">Array.</span><span style="color: #a6e22e;">from</span><span style="color: #f8f8f2;">(document.</span><span style="color: #a6e22e;">querySelectorAll</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">'*'</span><span style="color: #f8f8f2;">))</span> <span style="color: #75715e;">// Returns a real Array</span><span style="color: #f8f8f2;">Array.</span><span style="color: #a6e22e;">of</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">1</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">3</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// Similar to new Array(...), but without special one-arg behavior</span><span style="color: #f8f8f2;">[</span><span style="color: #ae81ff;">0</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">0</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">0</span><span style="color: #f8f8f2;">].</span><span style="color: #a6e22e;">fill</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">7</span><span style="color: #f8f8f2;">,</span> <span style="color: #ae81ff;">1</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// [0,7,7]</span><span style="color: #f8f8f2;">[</span><span style="color: #ae81ff;">1</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">3</span><span style="color: #f8f8f2;">].</span><span style="color: #a6e22e;">findIndex</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">x</span> <span style="color: #f92672;">=&gt;</span> <span style="color: #a6e22e;">x</span> <span style="color: #f92672;">==</span> <span style="color: #ae81ff;">2</span><span style="color: #f8f8f2;">)</span> <span style="color: #75715e;">// 1</span><span style="color: #f8f8f2;">[</span><span style="color: #e6db74;">"a"</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">"b"</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">"c"</span><span style="color: #f8f8f2;">].</span><span style="color: #a6e22e;">entries</span><span style="color: #f8f8f2;">()</span> <span style="color: #75715e;">// iterator [0, "a"], [1,"b"], [2,"c"]</span><span style="color: #f8f8f2;">[</span><span style="color: #e6db74;">"a"</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">"b"</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">"c"</span><span style="color: #f8f8f2;">].</span><span style="color: #a6e22e;">keys</span><span style="color: #f8f8f2;">()</span> <span style="color: #75715e;">// iterator 0, 1, 2</span><span style="color: #f8f8f2;">[</span><span style="color: #e6db74;">"a"</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">"b"</span><span style="color: #f8f8f2;">,</span> <span style="color: #e6db74;">"c"</span><span style="color: #f8f8f2;">].</span><span style="color: #a6e22e;">values</span><span style="color: #f8f8f2;">()</span> <span style="color: #75715e;">// iterator "a", "b", "c"</span>
<span style="color: #f8f8f2;">Object.</span><span style="color: #a6e22e;">assign</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">Point</span><span style="color: #f8f8f2;">,</span> <span style="color: #f8f8f2;">{</span> <span style="color: #a6e22e;">origin</span><span style="color: #f92672;">:</span> <span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">Point</span><span style="color: #f8f8f2;">(</span><span style="color: #ae81ff;">0</span><span style="color: #f8f8f2;">,</span><span style="color: #ae81ff;">0</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">})</span></pre></div><p>&nbsp;</p><h1>Promises</h1><p>Promises是處理異步操作的一種模式,之前在很多三方庫中有實現,比如jQuery的<a href="http://api.jquery.com/category/deferred-object/" target="_blank">deferred</a> 對象。當你發起一個異步請求,并綁定了<span style="background-color: silver;">.when()</span>, <span style="background-color: silver;">.done()</span>等事件處理程序時,其實就是在應用promise模式。</p><div class="highlight" style="background: #272822;"><pre><span style="color: #75715e;">//創建promise</span><span style="color: #66d9ef;">var</span> <span style="color: #a6e22e;">promise</span> <span style="color: #f92672;">=</span> <span style="color: #66d9ef;">new</span> <span style="color: #a6e22e;">Promise</span><span style="color: #f8f8f2;">(</span><span style="color: #66d9ef;">function</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">resolve</span><span style="color: #f8f8f2;">,</span> <span style="color: #a6e22e;">reject</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? <span style="color: #75715e;">// 進行一些異步或耗時操作</span>? ? <span style="color: #66d9ef;">if</span> <span style="color: #f8f8f2;">(</span> <span style="color: #75715e;">/*如果成功 */</span> <span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span>? ? ? ? <span style="color: #a6e22e;">resolve</span><span style="color: #f8f8f2;">(</span><span style="color: #e6db74;">"Stuff worked!"</span><span style="color: #f8f8f2;">);</span>? ? <span style="color: #f8f8f2;">}</span> <span style="color: #66d9ef;">else</span> <span style="color: #f8f8f2;">{</span>? ? ? ? <span style="color: #a6e22e;">reject</span><span style="color: #f8f8f2;">(Error(</span><span style="color: #e6db74;">"It broke"</span><span style="color: #f8f8f2;">));</span>? ? <span style="color: #f8f8f2;">}</span><span style="color: #f8f8f2;">});</span><span style="color: #75715e;">//綁定處理程序</span><span style="color: #a6e22e;">promise</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">then</span><span style="color: #f8f8f2;">(</span><span style="color: #66d9ef;">function</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">result</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span><span style="color: #75715e;">//promise成功的話會執行這里</span>? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">result</span><span style="color: #f8f8f2;">);</span> <span style="color: #75715e;">// "Stuff worked!"</span><span style="color: #f8f8f2;">},</span> <span style="color: #66d9ef;">function</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">err</span><span style="color: #f8f8f2;">)</span> <span style="color: #f8f8f2;">{</span><span style="color: #75715e;">//promise失敗會執行這里</span>? ? <span style="color: #a6e22e;">console</span><span style="color: #f8f8f2;">.</span><span style="color: #a6e22e;">log</span><span style="color: #f8f8f2;">(</span><span style="color: #a6e22e;">err</span><span style="color: #f8f8f2;">);</span> <span style="color: #75715e;">// Error: "It broke"</span><span style="color: #f8f8f2;">});</span></pre></div><h1>總結</h1><p>總結就是一句話,前后端差異越來越小了。</p><h1>REFERENCE</h1><ul><li>Google traceur online compiler <a href="http://google.github.io/traceur-compiler/demo/repl.html" target="_blank">http://google.github.io/traceur-compiler/demo/repl.html</a></li><li>array destruction <a href="http://ariya.ofilabs.com/2013/02/es6-and-destructuring-assignment.html" target="_blank">http://ariya.ofilabs.com/2013/02/es6-and-destructuring-assignment.html</a></li><li>class <a href="http://www.joezimjs.com/javascript/javascript-prototypal-inheritance-and-what-es6-classes-have-to-say-about-it/" target="_blank">http://www.joezimjs.com/javascript/javascript-prototypal-inheritance-and-what-es6-classes-have-to-say-about-it/</a></li><li>enhanced object literal <a href="http://maximilianhoffmann.com/posts/object-based-javascript-in-es6" target="_blank">http://maximilianhoffmann.com/posts/object-based-javascript-in-es6</a></li><li>parameters <a href="http://globaldev.co.uk/2013/10/es6-part-4/" target="_blank">http://globaldev.co.uk/2013/10/es6-part-4/</a></li><li>let keyword <a href="http://globaldev.co.uk/2013/09/es6-part-2/" target="_blank">http://globaldev.co.uk/2013/09/es6-part-2/</a></li><li>for of iterator <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of" target="_blank">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of#Browser_compatibility</a></li><li>the Iterator protocol <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/The_Iterator_protocol" target="_blank">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/The_Iterator_protocol</a></li><li>generators <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*" target="_blank">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*</a></li><li>ES6 Iterators, Generators, and Iterables <a href="http://domenic.me/2013/09/06/es6-iterators-generators-and-iterables/" target="_blank">http://domenic.me/2013/09/06/es6-iterators-generators-and-iterables/</a></li><li>proxies <a href="http://ariya.ofilabs.com/2013/07/es6-and-proxy.html" target="_blank">http://ariya.ofilabs.com/2013/07/es6-and-proxy.html</a></li><li>symbols <a href="http://tc39wiki.calculist.org/es6/symbols/" target="_blank">http://tc39wiki.calculist.org/es6/symbols/</a></li><li>promise http://www.html5rocks.com/en/tutorials/es6/promises/</li><li>8 cool features in ES6 <a href="http://code.tutsplus.com/tutorials/eight-cool-features-coming-in-es6--net-33175" target="_blank">http://code.tutsplus.com/tutorials/eight-cool-features-coming-in-es6--net-33175</a> (此文章錯誤較多)</li></ul><a class="fastCom" id="fastCom" title="快速評論" href="#comment_form_container"></a></div><div id="MySignature" style="display: block;"><p>Feel free to repost but keep the link to this page please!</p></div><div class="clear"></div><div id="blog_post_info_block"><div id="BlogPostCategory">分類: <a href="http://www.cnblogs.com/Wayou/category/467062.html" target="_blank">JavaScript</a></div><div id="EntryTag">標簽: <a href="http://www.cnblogs.com/Wayou/tag/javascript/">javascript</a>, <a href="http://www.cnblogs.com/Wayou/tag/es6/">es6</a>, <a href="http://www.cnblogs.com/Wayou/tag/ecmascript6/">ecmascript6</a>, <a href="http://www.cnblogs.com/Wayou/tag/harmony/">harmony</a></div><div id="blog_post_info"><div id="green_channel">? ? ? ? <a href="javascript:void(0);" id="green_channel_digg" οnclick="DiggIt(3663567,cb_blogId,1);green_channel_success(this,'謝謝推薦!');">好文要頂</a>? ? ? ? ? ? <a id="green_channel_follow" οnclick="follow('c5e8573b-1ed6-e111-aa3f-842b2b196315');" href="javascript:void(0);">關注我</a>? ? <a id="green_channel_favorite" οnclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏該文</a>? ? <a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" οnclick="ShareToTsina()"><img src="//common.cnblogs.com/images/icon_weibo_24.png" alt=""></a>? ? <a id="green_channel_wechat" href="javascript:void(0);" title="分享至微信" οnclick="shareOnWechat()"><img src="//common.cnblogs.com/images/wechat.png" alt=""></a></div><div id="author_profile">? ? <div id="author_profile_info" class="author_profile_info">? ? ? ? ? ? <a href="http://home.cnblogs.com/u/Wayou/" target="_blank"><img src="//pic.cnblogs.com/face/431064/20140914104240.png" class="author_avatar" alt=""></a>? ? ? ? <div id="author_profile_detail" class="author_profile_info">? ? ? ? ? ? <a href="http://home.cnblogs.com/u/Wayou/">劉哇勇</a><br>? ? ? ? ? ? <a href="http://home.cnblogs.com/u/Wayou/followees">關注 - 10</a><br>? ? ? ? ? ? <a href="http://home.cnblogs.com/u/Wayou/followers">粉絲 - 2494</a>? ? ? ? </div>? ? </div>? ? <div class="clear"></div>? ? <div id="author_profile_honor">榮譽:<a href="http://www.cnblogs.com/expert/" target="_blank">推薦博客</a></div>? ? <div id="author_profile_follow">? ? ? ? ? ? ? ? <a href="javascript:void(0);" οnclick="follow('c5e8573b-1ed6-e111-aa3f-842b2b196315');return false;">+加關注</a>? ? </div></div><div id="div_digg">? ? <div class="diggit" οnclick="votePost(3663567,'Digg')">? ? ? ? <span class="diggnum" id="digg_count">65</span>? ? </div>? ? <div class="buryit" οnclick="votePost(3663567,'Bury')">? ? ? ? <span class="burynum" id="bury_count">0</span>? ? </div>? ? <div class="clear"></div>? ? <div class="diggword" id="digg_tips">? ? </div></div></div><div class="clear"></div><div id="post_next_prev"><a href="http://www.cnblogs.com/Wayou/p/things_you_dont_know_about_frontend.html" class="p_n_p_prefix">? </a> 上一篇:<a href="http://www.cnblogs.com/Wayou/p/things_you_dont_know_about_frontend.html" title="發布于2014-04-10 19:58">前端不為人知的一面--前端冷知識集錦</a><br><a href="http://www.cnblogs.com/Wayou/p/highlight_code_with_sublimetext_style.html" class="p_n_p_prefix">? </a> 下一篇:<a href="http://www.cnblogs.com/Wayou/p/highlight_code_with_sublimetext_style.html" title="發布于2014-04-14 17:24">如何在博客中使用SublimeText風格的代碼高亮樣式</a><br></div></div>

</div><div class="postDesc">posted @ <span id="post-date">2014-04-14 11:17</span> <a href="http://www.cnblogs.com/Wayou/">劉哇勇</a> 閱讀(<span id="post_view_count">184768</span>) 評論(<span id="post_comment_count">36</span>) ?<a href="https://i.cnblogs.com/EditPosts.aspx?postid=3663567" rel="nofollow">編輯</a> <a href="#" οnclick="AddToWz(3663567);return false;">收藏</a></div></div><script type="text/javascript">var allowComments=true,cb_blogId=123544,cb_entryId=3663567,cb_blogApp=currentBlogApp,cb_blogUserGuid='c5e8573b-1ed6-e111-aa3f-842b2b196315',cb_entryCreatedDate='2014/4/14 11:17:00';loadViewCount(cb_entryId);var cb_postType=1;</script></div>

轉載于:https://www.cnblogs.com/Vayne-N/p/8094680.html

總結

以上是生活随笔為你收集整理的ES6新特性(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。